2010-04-16 23 views
40

में शीर्ष 5 का चयन मैंइकाई की रूपरेखा

[Person] 
PersonID, EmailAddress, FirstName, LastName 

[OnlineAccount] 
OnlineAccountID, PersonID, Nickname 

प्रत्येक व्यक्ति 0- * OnlineAccount के लिए अनुमति दी है।

सी # के साथ इकाई ढांचे में, मैं शीर्ष 5 व्यक्तियों का चयन कैसे करूं जिनमें अधिकांश खाते हैं?

उत्तर

93

इस प्रयास करें:

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 अभिव्यक्तियों का अनुवाद करता है।

+0

क्या यह वास्तव में डेटाबेस के विरुद्ध 'SELECT TOP 5 ...' क्वेरी के रूप में समाप्त होगा? –

+0

@ पीटर लिलाववॉल्ड: हां। क्वेरी निष्पादन में केवल 5 पंक्तियां लेंगी। – LukLed

+0

@LukLed क्या आप इसके बारे में निश्चित हैं? आपका मतलब है कि ईएफ आईनेमरेबल एक्सटेंशन विधि प्रक्रियाओं से पहले अपने निष्पादन को पूरा नहीं करता है? मुझे यकीन नहीं है कि यह सच है .... – Matthew

संबंधित मुद्दे