एक controversial blog post आज में, Hackification क्या संस्थाओं ढांचे के लिए नए LINQ में एक बग हो गया लगता है पर pontificates:LINQ
var alice = data.Customers.First(c => c.Name == "Alice");
:
मान लीजिए मैं ग्राहक की खोज करनेठीक है, जो अच्छी तरह से काम करता है। अब चलो देखें कि क्या मैं उसके आदेश से एक पा सकते हैं करते हैं:
var order = (from o in alice.Orders where o.Item == "Item_Name" select o).FirstOrDefault();
LINQ करने वाली एसक्यूएल बच्चे पंक्ति मिल जाएगा। LINQ-to-Entities चुपचाप कुछ भी वापस नहीं आएगा। मेरी खोज को दोहरा
foreach(var order in data.Orders) { Console.WriteLine("Order: " + order.Item); }
और अब:
अब मैं के माध्यम से डेटाबेस में सभी आदेश पुनरावृति लगता है जाने
var order = (from o in alice.Orders where o.Item == "Item_Name" select o).FirstOrDefault();
वाह! LINQ-to-Entities अचानक मुझे बता रहा है कि बच्चे की वस्तु मौजूद है, मुझे पहले बताए हुए कि यह नहीं था!
मेरे आरंभिक प्रतिक्रिया है कि यह एक बग होना ही था था, लेकिन आगे विचार (और backed up by the ADO.NET Team) के बाद, मुझे एहसास हुआ है कि इस व्यवहार इकाई की रूपरेखा द्वारा नहीं आलसी लोड हो रहा है आदेश सबक्वेरी जब ऐलिस से खींचा जाता है कारण होता था DataContext।
var order = (from o in alice.Orders
where o.Item == "Item_Name"
select o).FirstOrDefault();
और किसी भी तरह से DataContext पर न गया, जबकि उसके foreach पाश:
foreach(var order in data.Orders)
DataContext ऐक्सेस करना है
इसका कारण यह है आदेश में एक LINQ-टू-वस्तु क्वेरी है ।
LINQ-to-SQL वास्तव में ऑर्डर के लिए आलसी लोड गुणों का निर्माण करता है, ताकि जब एक्सेस किया जाए, तो एक और क्वेरी करेगा, LINQ से Entities आपको संबंधित डेटा को मैन्युअल रूप से पुनर्प्राप्त करने के लिए छोड़ देता है।
अब, मैं ओआरएम का बड़ा प्रशंसक नहीं हूं, और यह सटीक कारण है। मैंने पाया है कि आप अपने उंगलियों पर तैयार सभी डेटा प्राप्त करने के लिए, वे बार-बार आपकी पीठ के पीछे पूछताछ निष्पादित करते हैं, उदाहरण के लिए, उपरोक्त linq-to-sql क्वेरी ऑर्डर प्राप्त करने के लिए ग्राहकों की प्रति पंक्ति अतिरिक्त क्वेरी चला सकती है ।
हालांकि, ऐसा करने वाला ईएफ मुख्य रूप से कम से कम आश्चर्य के सिद्धांत का उल्लंघन करता प्रतीत होता है। हालांकि यह चीजों को करने का तकनीकी रूप से सही तरीका है (आपको ऑर्डर पुनर्प्राप्त करने के लिए दूसरी क्वेरी चलनी चाहिए, या दृश्य से सब कुछ पुनर्प्राप्त करना चाहिए), ऐसा व्यवहार नहीं करता है जैसे आप ओआरएम से अपेक्षा करेंगे।
तो, क्या यह अच्छी ढांचा डिजाइन है? या माइक्रोसॉफ्ट हमारे लिए यह सोचने पर है?
मैं सहमत हूं, इस ब्लॉग पोस्ट को पूरी तरह से सूचित नहीं किया गया है। मेरा मानना है कि उन्हें इसकी आलोचना करने से पहले एल 2 ई सीखना थोड़ा और समय लेना चाहिए था - ऐसा लगता है कि उन्होंने फैसला किया कि उन्हें लेख लिखने से पहले उन्हें पसंद नहीं आया, जिससे भारी उत्तेजना हुई क्योंकि उन्हें नहीं पता था कि उन्हें लोड करना है() ... – naspinski