2011-10-03 30 views
6

में शब्दकोश उपयोग मेरे पास है:LINQ: क्वेरी

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity.Where(f => dict[f.key].Contains(f.someValue)) 

इस का उत्पादन त्रुटि

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] get_Item(Int32)' method 

जबकि सूची के साथ काम करता है:

List<int> l = new ... 
var a = SomeEntity.Where(f => l.Contains(f.someValue)) 

तो की इस सीमा है लिनक से ईएफ या क्या मुझे कुछ याद आ रही है?

उत्तर

10

यह इकाई फ्रेमवर्क की प्रकृति है - जब आप अपनी क्वेरी में अभिव्यक्ति डालते हैं, तो उन्हें एसक्यूएल में अनुवाद करना सबसे अच्छा होता है, ताकि काम सर्वर पर किया जा सके।

आपके पहले उदाहरण में, यह SQL में क्वेरी और शब्दकोश पुनर्प्राप्ति कॉल दोनों का अनुवाद करने का प्रयास करता है, और यह असमर्थ है, क्योंकि यह नहीं जानता कि कैसे करें।

आपके दूसरे उदाहरण में, आप बस क्वेरी में एक सूची उत्तीर्ण कर रहे हैं। यह जानता है कि एसक्यूएल में इसका अनुवाद कैसे करें।

ऐसे कुछ गॉथैस हैं, इसलिए आपको बस अपनी ईएफ क्वेरी को परिभाषित करने से पहले इसके बारे में सावधान रहना होगा।

संपादित

बस देखा है कि आपका पहला प्रश्न जब शब्दकोश से पढ़ने क्वेरी परिणामों का उपयोग करता है। तो जब से तुम वास्तव में SQL क्वेरी में अपने शब्दकोश से पारित नहीं कर सकते हैं, तो आप शायद पहले डीबी से सभी रिकॉर्ड को पुनः प्राप्त करने की आवश्यकता होगी, तो LINQ करने वाली वस्तुओं का उपयोग की तरह, अपने जाँच करने के लिए:

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity 
    .ToArray() 
    .Where(f => dict[f.key].Contains(f.someValue)); 

ToArray() विधि पूरे परिणाम सेट को मेमोरी में खींचती है (इसे करने के अन्य तरीके हैं, लेकिन इस तरह मैं आमतौर पर इसे करता हूं), और निम्नलिखित Where खंड LINQ-to-Entities के बजाय LINQ-to-ऑब्जेक्ट्स में चलाता है, जिसका अर्थ है कि आपका शब्दकोश कोड ठीक चल जाएगा।

+0

बहुत स्पष्ट उत्तर, धन्यवाद – ren