मैं एफई 3.5 के साथ इस सीमा से जूझ पिछले 6 महीनों के खर्च किया है और जब तक मैं दुनिया में होशियार व्यक्ति नहीं हूँ, मैं बहुत यकीन है कि मैं कुछ उपयोगी इस विषय पर की पेशकश करने के लिए है हूँ।
एसक्यूएल "या शैली" भाव एक गरीब क्वेरी निष्पादन योजना में परिणाम होगा की एक 50 मील उच्च पेड़ से बढ़ रही द्वारा उत्पन्न। मैं कुछ मिलियन पंक्तियों से निपट रहा हूं और प्रभाव काफी है।
वहाँ एक छोटे से हैक मुझे लगता है कि मदद करता है अगर आप सिर्फ आईडी द्वारा संस्थाओं के एक समूह के लिए देख रहे हैं 'में' किसी SQL करने के लिए मिल गया है:
private IEnumerable<Entity1> getByIds(IEnumerable<int> ids)
{
string idList = string.Join(",", ids.ToList().ConvertAll<string>(id => id.ToString()).ToArray());
return dbContext.Entity1.Where("it.pkIDColumn IN {" + idList + "}");
}
जहां pkIDColumn के अपने प्राथमिक कुंजी आईडी स्तंभ नाम है आपकी Entity1 तालिका।
लेकिन पढ़ना जारी रखें!
यह ठीक है, लेकिन यह आवश्यकता है मैं पहले से ही मैं क्या खोजने की जरूरत है की आईडी है। कभी-कभी मैं चाहता हूं कि मेरी अभिव्यक्तियां अन्य रिश्तों में पहुंच जाएं और मेरे पास जो जुड़े हैं वे उन जुड़े संबंधों के लिए मानदंड हैं।
यदि मेरे पास अधिक समय था तो मैं इस दृष्टि का प्रतिनिधित्व करने की कोशिश करूंगा, लेकिन मैं इस वाक्य को सिर्फ एक पल का अध्ययन नहीं करता हूं: किसी व्यक्ति, सरकारी आईडी और सरकारी आईडी टाइप प्रकार के साथ एक स्कीमा पर विचार करें। एंड्रयू टैपरेट (व्यक्ति) में दो आईडी कार्ड (सरकारी आईडी) हैं, ओरेगॉन (सरकारी आईडी टाइप) और वाशिंगटन (सरकारी आईडी टाइप) से एक है।
अब से एक एडीएमएक्स उत्पन्न करें।
अब कल्पना आप सभी एक निश्चित आईडी मूल्य के लोगों खोजना चाहते हैं, कहते हैं कि 1234567.
यह एक एकल डाटाबेस इस के साथ मारा के साथ पूरा किया जा सकता है:
dbContext context = new dbContext();
string idValue = "1234567";
Expression<Func<Person,bool>> expr =
person => person.GovernmentID.Any(gid => gid.gi_value.Contains(idValue));
IEnumerable<Person> people = context.Person.AsQueryable().Where(expr);
आप सबक्वेरी दिखाई दे रही है यहाँ? उत्पन्न एसक्यूएल उप-प्रश्नों के बजाय 'जॉइन' का उपयोग करेगा, लेकिन प्रभाव वही है। इन दिनों एसक्यूएल सर्वर सबक्वेरी का अनुकूलन में वैसे भी कवर के तहत मिलती है, लेकिन वैसे भी ...
इस काम के लिए महत्वपूर्ण अभिव्यक्ति के अंदर .Any है।
धन्यवाद डैनियल। सादा लिंक के साथ एक ही वाक्यविन्यास ठीक काम करता है। तो, ऐसा लगता है कि समस्या .NET 3.5 SP1 में ईएफ के साथ है? कंस्ट्रैसिस के बिना कंटेनर के बराबर है: जहां upperSearchList.All (x => (person.FirstName + person.LastName)। (X))। ToList(); –
यदि मैं कोशिश करता हूं कि upperSearchList.All (arg => arg == arg) यह वही त्रुटि फेंकता है। तो समस्या सभी विधि के साथ है ... –
LINQ से Entities एक अद्भुत तकनीक है, लेकिन SQL अनुवाद इंजन सीमित है। मैं अपने हाथों को आधिकारिक दस्तावेज पर नहीं डाल सकता, लेकिन मेरे अनुभव में, यदि क्वेरी में केवल मूल गणित और स्ट्रिंग/डेट फ़ंक्शंस से अधिक शामिल है, तो यह काम नहीं करेगा। क्या आपको उस पोस्ट को देखने का मौका मिला है जिसे मैंने लिंक किया था? यह एक "WHERE..IN" प्रकार क्वेरी को एक रूप में परिवर्तित करने की प्रक्रिया का वर्णन करता है जो LINQ से Entities को SQL में अनुवाद कर सकता है। –