2009-08-11 8 views
10

मैं LINQ और LINQ से SQL में नया हूं और यह समझ नहीं पा रहा हूं कि इस कोड के साथ क्या गलत है। Excetpion.Message मुझे.NET: LINQ का अंतिम()

"क्वेरी ऑपरेटर 'अंतिम' समर्थित नहीं है।"

जो मैं करने की कोशिश कर रहा हूं वह नवीनतम 100 में से शुरुआती LastActivityUtc प्राप्त करता है। कोड निम्नानुसार है।

var postTimes = from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc; 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count() >= 2) 
{ 
    startDate = postTimes.Take(100).Last().Value; 
} 

उत्तर

20

ब्रैंडन एक समाधान पोस्ट किया गया है, लेकिन यह स्मृति में पूरी सूची को कॉपी की आवश्यकता है।

तुम सिर्फ डेटाबेस क्वेरी से प्रक्रिया में करने के लिए "संक्रमण" करने के लिए, आप उपयोग कर सकते हैं AsEnumerable चाहते हैं:

startDate = postTimes.Take(100).AsEnumerable().Last().Value; 

कहा करने के बाद, आप संभवतः करना ToList() कॉल करना चाहते हैं, लेकिन पहले - गिनती के लिए एक बार क्वेरी निष्पादित करने के लिए होने से बचने के लिए, और एक बार अंतिम मान के लिए:

var postTimes = (from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc).Take(100).ToList(); 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count >= 2) 
{ 
    startDate = postTimes.Last().Value; 
} 

कि डेटाबेस क्वेरी एक बार पर अमल करेंगे, लेकिन केवल लाने स्मृति में पहले 100 रिकॉर्ड। बेशक, यह कुछ हद तक गिर जाता है यदि आप postTimes कहीं और उपयोग करने जा रहे थे ...

+1

चूहे, जाहिर है, मेरा प्रारंभिक उत्तर बेवकूफ नहीं था! मैं इसे मार्क पर दोष देता हूं;) –

+0

@ मेहरदाद - मैं नम्रता से जिम्मेदारी स्वीकार करता हूं! – Marc

+2

कौन अधिक मूर्ख है? मूर्ख, या मूर्ख जो उसके पीछे है? –

4
postTimes पर

कॉल .ToList() और फिर .Last उपयोग करने का प्रयास()

startDate = postTimes.Take(100).ToList().Last().Value; 
+1

यह आपके द्वारा उल्लिखित कारणों के लिए काम नहीं करेगा। '.ऑनलाइन()' के बजाय अनन्य() 'भी काम करेगा। इन दो कामों का कारण यह है कि वे एसक्यूएल में अभिव्यक्ति का अनुवाद करने की कोशिश नहीं करते हैं। वे सिर्फ 100 पंक्तियां पुनर्प्राप्त करते हैं और इसे क्लाइंट पर संसाधित करते हैं। –

+0

मेरी गलती, मैं अपने उत्तर के उस हिस्से को हटा दूंगा। – Brandon