2015-07-09 9 views
11

मुझे कुछ अजीब/अप्रत्याशित व्यवहार का सामना करना पड़ा है जिसमें एक लिंक अभिव्यक्ति में Guid.ToString() फ़ोरैच लूप में Guid.ToString() से भिन्न परिणाम देता है।लिंक क्यों है। लिंक में पूंजीकृत स्ट्रिंग लौटने के लिए?

क्या विधि कर रही है:

प्रश्न में विधि बस एक वस्तु लेने और फिर मूल वस्तु से कोई नया दृश्य-मॉडल बनाता है। जिस कंपनी के लिए मैंने काम किया है, उसने फैसला किया है कि हमारे पुराने जेएसओएन सीरियलाइज़र में से एक के कारण ग्रिड को दृश्य-मॉडल पर अनुमति नहीं दी जाएगी, जिसमें गड्ड को सही ढंग से क्रमबद्ध नहीं किया गया था।

समस्या/अप्रत्याशित परिणाम:

जबकि डिबगिंग/मेरी विधि का परीक्षण मैंने पाया कि Linq अभिव्यक्ति मेरे द्वारा बनाए गए एक अजीब परिणाम लौट रहा था। मेरे ग्रिड को अपनी स्ट्रिंग प्रस्तुति में परिवर्तित करते समय, परिणाम स्वचालित रूप से पूंजीकृत किया जा रहा था। मुझे विश्वास नहीं था कि यह पहली बार लिंक अभिव्यक्ति थी, लेकिन एक बार जब मैंने लॉजिक को फोरैच लूप में परिवर्तित कर दिया था तो मुझे अपने गुड के निचले-चरण वाले स्ट्रिंग का प्रतिनिधित्व मिला।

उदाहरण कोड:

कृपया ध्यान दें कि lookupList (ID1 आईडी 2, ID3) के लिए संपत्ति प्रकार प्रकार Guid और NewClass पर सभी गुणों की हैं प्रकार स्ट्रिंग के सभी कर रहे हैं।

Linq अभिव्यक्ति:

List<NewClass> returnList = lookupList.Select(i => new NewClass { 
        Property1 = i.ID1.ToString(), 
        Property2 = i.ID2.ToString(), 
        Property3 = i.ID3.ToString(), 
        ..... 
       }).ToList(); 

रिटर्न:

{ 
    Property1=7081C549-64D6-458E-A693-0D2C9C47D183 
    Property2=06DD6A59-D339-4E15-89EA-48803DBA271E 
    Property3=9A876EDD-3B79-C27E-1680-E0820A0CD6EC 
} 

foreach पाश:

var returnList = new List<NewClass>(); 

foreach (var item in lookupList) 
{ 
    returnList.Add(new NewClass 
    { 
     Property1 = item.ID1.ToString(), 
     Property2 = item.ID2.ToString(), 
     Property3 = item.ID3.ToString(), 
     ..... 
    }); 
} 

रिटर्न:

{ 
    Property1=7081c549-64d6-458e-a693-0d2c9c47d183 
    Property2=06dd6a59-d339-4e15-89ea-48803dba271e 
    Property3=9a876edd-3b79-c27e-1680-e0820a0cd6ec 
} 

प्रश्न:

यह क्यों हो रहा है और यह अपेक्षित व्यवहार है? मैं लिंकक अभिव्यक्ति और फोरैच लूप दोनों को उसी परिणाम को वापस करने की अपेक्षा करता हूं जब .ToString() मेरे ग्रिड पर लागू होता है लेकिन किसी भी तरह यह नहीं है। मैंने यह भी जांच की है कि कक्षा में .ToString() ओवरराइड नहीं हैं।

अग्रिम धन्यवाद।

अद्यतन:

lookupList एक .ToList() द्वारा नियंत्रित किया गया है इससे पहले कि यह मेरी विधि पूरी करता है। LookupList प्रकार List<t> है t एक कस्टम व्यापार इकाई है जिसमें डेटाबेस के पास अतिरिक्त गुण नहीं हैं। माफ़ी, मैंने अपने मूल प्रश्न में यह स्पष्ट नहीं किया। ताकि आप LINQ to SQL, और नहीं LINQ to object, तो दो प्रश्नों ही नहीं हैं का उपयोग कर रहे

+1

वहाँ एक डेटाबेस शामिल है? क्योंकि पहला कॉल आपके एसक्यूएल सर्वर के संदर्भ में निष्पादित किया जा सकता है, जबकि दूसरा सबसे निश्चित रूप से क्लियर के संदर्भ में निष्पादित करता है। यह वास्तव में 'लुकअपलिस्ट' पर निर्भर करता है। – Silvermind

+1

इस समस्या को पुन: उत्पन्न नहीं कर सकता .NET 4.0 –

+0

एक डेटाबेस शामिल है लेकिन परिणाम मेरी विधि को हिट करने से पहले ToList'ed किया गया है। लुकअपलिस्ट सूची है जहां टी एक कस्टम व्यावसायिक इकाई है जो डेटाबेस तालिका की तरह दिखती है लेकिन इसमें कुछ अतिरिक्त गुण हैं। –

उत्तर

3

तो lookupList, एक IQueryable वस्तु है।

lookupList.Select(i => new NewClass { Property1 = i.ID1.ToString(), etc.. 

SQL चयन निष्पादित करेगा, परिणाम आपके डीबीएमएस पर निर्भर करेगा। मेरा अनुमान है कि ToString तरह CAST(Property1, varchar)

इस क्वेरी जबकि कुछ में अनुवाद हो जाएगा:

foreach (var item in lookupList) 
{ 
    returnList.Add(new NewClass { Property1 = item.ID1.ToString(), etc.. 

पहले अपने डेटाबेस में एक का चयन करता है, और फिर उस पर ToString बुला। इसलिए सी # ऑब्जेक्ट GUID की ToString विधि ट्रिगर की गई विधि है।

उदाहरण के लिए इस प्रयास करें:

List<NewClass> returnList = lookupList.ToList().Select(i => new NewClass { 
       Property1 = i.ID1.ToString(), 
       Property2 = i.ID2.ToString(), 
       Property3 = i.ID3.ToString(), 
       ..... 
      }).ToList(); 

यह लोअरकेस गुण लौटना चाहिए।

। ToString सामान्य रूप से SQL में समर्थन नहीं करता है, और पहली क्वेरी अपवाद होना चाहिए। लेकिन मुझे लगता है कि आपकी टीम में से कोई भी blog post that explain how you can create a SQL function that will map an Entity Framework call पढ़ता है।

दिलचस्प तथ्य: उदाहरण फ़ंक्शन अपरकेस ग्रिड तार बनाते हैं।

संपादित करें: वस्तु को शुद्ध LINQ में, इस कोड को वापस लोअरकेस तार:

var lookupList = new[] { new Tuple<Guid, Guid>(Guid.NewGuid(), Guid.NewGuid()) }; 
var returnList = lookupList.Select(i => new 
{ 
    Property1 = i.Item1.ToString(), 
    Property2 = i.Item2.ToString(), 
}).ToList(); 

हम lookupList वस्तु पर अधिक infos और उन गुणों IDx की जरूरत है। क्या वे शुद्ध सी # Guid object हैं?

आपने कहा कि आप पहले से ही हैं। अपनी ऑब्जेक्ट को सूचीबद्ध करें।

खराब:

lookupList.ToList(); 
var returnList = lookupList.Select(i => new NewClass { 

अच्छा: यह अगर आपके इसे गलत तरीके से कर रहे हैं काम नहीं करेगा

var purePOCOList = lookupList.ToList(); 
var returnList = purePOCOList.Select(i => new NewClass { 
+0

आपकी कहानियां क्या समझ में आती हैं, हालांकि मेरी लुकअपलिस्ट को मेरी विधि को हिट करने से पहले (ToList) की गणना की गई है। –

+0

@MrHickle Well, अगर आपने 'lookupList' पर 'ToList()' कहा है, तो यह' lookupList' को स्वयं नहीं बदलता है। इसमें अभी भी वही प्रश्न होगा। – Dzienny

+0

@Dzienny: अच्छा बिंदु, .इसलिस्ट जगह में सूचीबद्ध नहीं है, यह एक नई वस्तु देता है। –