मैंने पिछले 6 महीनों को EF 3.5 के साथ इस सीमा से जूझते हुए बिताया है और जब तक मैं दुनिया का सबसे चतुर व्यक्ति नहीं हूं, मुझे पूरा यकीन है कि मेरे पास इस विषय पर पेशकश करने के लिए कुछ उपयोगी है।
"OR स्टाइल" अभिव्यक्तियों के 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 तालिका का प्राथमिक कुंजी आईडी कॉलम नाम है।
लेकिन काट देना!
यह ठीक है, लेकिन इसके लिए यह आवश्यक है कि मेरे पास पहले से ही मेरे पास मौजूद आईडी हैं जो मुझे खोजने की आवश्यकता है। कभी-कभी मैं बस यही चाहता हूं कि मेरे भाव अन्य संबंधों में पहुंचें और मेरे पास जो कुछ भी है वह उन जुड़े हुए संबंधों के लिए मापदंड है।
अगर मेरे पास अधिक समय होता है तो मैं इस नेत्रहीन का प्रतिनिधित्व करने की कोशिश करूंगा, लेकिन मैं इस वाक्य का सिर्फ एक पल का अध्ययन नहीं करता: एक व्यक्ति, सरकार और सरकार के तालमेल के साथ एक स्कीमा पर विचार करें। एंड्रयू टापर्ट (व्यक्ति) के दो आईडी कार्ड (GovernmentId) हैं, एक ओरेगन (GovernmentIdType) और एक वाशिंगटन (GovernmentIdType) से है।
अब इससे एक edmx जनरेट करें।
अब कल्पना कीजिए कि आप एक निश्चित आईडी मान वाले सभी लोगों को ढूंढना चाहते हैं, 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);
क्या आप यहां उपकुंजी देखते हैं? उत्पन्न चक्र उप-प्रश्नों के बजाय 'जॉइन' का उपयोग करेगा, लेकिन प्रभाव समान है। इन दिनों SQL सर्वर उप-श्रेणियों को वैसे भी कवर के तहत जोड़ देता है, लेकिन वैसे भी ...
इस काम की कुंजी है। अभिव्यक्ति के अंदर कोई भी।