इस प्रयास करें:
var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5);
यह रिटर्न IQueryable<Person>
। यह अभी तक परिणाम नहीं लौटाता है, क्योंकि यह स्थगित निष्पादन लागू करता है। यह एसक्यूएल करने के लिए अनुवाद किया जाएगा और जरूरत पड़ने पर मार डाला:
SELECT TOP 5 p.PersonID, p.EmailAddress, p.FirstName, p.LastName
FROM Person p
ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC
यह इस नहीं होगा:
var metarializedItems = items.ToList(); // ToList forces execution
या
foreach(var item in items) // foreach forces execution
उदाहरण ऊपर करने के लिए यह एक समान SQL करने के लिए अनुवाद कर देगा सटीक एसक्यूएल। अलग-अलग ईएफ संस्करण विभिन्न एसक्यूएल उत्पन्न कर सकता है, लेकिन मैंने इसे लिखा है कि यह कैसे काम करता है। Take(5)
का अनुवाद TOP 5
है। OrderByDescending(u => u.OnlineAccounts.Count)
का अनुवाद ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC
है। यह इकाई फ्रेमवर्क की शक्ति है। यह एसक्यूएल में .NET अभिव्यक्तियों का अनुवाद करता है।
क्या यह वास्तव में डेटाबेस के विरुद्ध 'SELECT TOP 5 ...' क्वेरी के रूप में समाप्त होगा? –
@ पीटर लिलाववॉल्ड: हां। क्वेरी निष्पादन में केवल 5 पंक्तियां लेंगी। – LukLed
@LukLed क्या आप इसके बारे में निश्चित हैं? आपका मतलब है कि ईएफ आईनेमरेबल एक्सटेंशन विधि प्रक्रियाओं से पहले अपने निष्पादन को पूरा नहीं करता है? मुझे यकीन नहीं है कि यह सच है .... – Matthew