2011-08-31 14 views
32

मैं सूची में पहला मान और अंतिम मूल्य प्राप्त करने का प्रयास कर रहा हूं। क्वेरी ऑपरेटर First() समर्थित है लेकिन Last() और LastOrDefault() त्रुटि प्रदान करता है। क्या मैं गलत तरीके से Last() ऑपरेटर का उपयोग कर रहा हूं?अंतिम और LastOrDefault समर्थित नहीं

var purchaseBills = db.PurchaseBills.OrderBy(p => p.BillID); 

    if (purchaseBills.Count() >0) 
    { 
     var firstBill= purchaseBills.First(); //This is supported 

     //Attempt 1      
     var lastBill = purchaseBills.Last(); // Not supported 

     //Attempt 2 
     var lastBill = purchaseBills.LastOrDefault(); //Not supported 

     //Attempt 3 
     var lastBill = purchaseBills.Reverse().First(); //Not supported 

     textBoxPurchaseBillFrom.Text = firstBill.BillNo.ToString(); 
     textBoxPurchaseBillTo.Text = lastBill.BillNo.ToString(); 
    } 

अद्यतन: --Errors--

प्रयास 1: क्वेरी ऑपरेटर 'पिछले' समर्थित नहीं है।

प्रयास 2: क्वेरी ऑपरेटर 'LastOrDefault' समर्थित नहीं है।

प्रयास 3: क्वेरी ऑपरेटर 'रिवर्स' समर्थित नहीं है।

+0

त्रुटि क्या है? आप किस प्रश्न प्रदाता का उपयोग कर रहे हैं? –

+0

[LINQ से संस्थाओं का संभावित डुप्लिकेट अंतिम विधि को पहचान नहीं करता है। सच?] (Http://stackoverflow.com/questions/7293639/linq-to-entities-does-not-recognize-the-method-last-really)। इस सवाल को दूसरे प्रश्न से एक महीने पहले पूछा गया था, लेकिन उस प्रश्न के बेहतर जवाब हैं। किसी भी() सुझाव के लिए –

उत्तर

35
  • इसके बजाय एक स्वयं की सूची में ToList() या ToArray() को फोन करके यह डालने की मैं AsEnumerable() उपयोग करने के लिए पसंद करेंगे।
  • साथ ही दूसरों की तरह आप OrderByDescending()
  • Count() के बजाय कोशिश मैं Any() का प्रयोग करेंगे चाहिए।
+2

+1। धन्यवाद :) – Marshal

+1

मुझे उतरने का आदेश मिला, फिर FirstOrDefault() का उपयोग कर काम करेगा। –

16

या तो आप

.OrderByDescending(p => p.BillID) 

करने के लिए अपने OrderBy स्विच (और पहली उपयोग करें) या आप की तरह

purchaseBills.ToArray().Last() 

कुछ करना है, तो यह महंगा नहीं है।

10

समस्या Last या Reverse के लिए एसक्यूएल में कोई आसान अनुवाद है कि है, इसलिए या तो स्मृति में कुछ करने के लिए इसे परिवर्तित (ToList, ToArray) अगर वहाँ भी कई रिकॉर्ड होने के लिए नहीं जा रहे हैं, या आप क्वेरी चला सकते हैं दूसरी बार, OrderByDescendingOrderBy के बजाय और First का उपयोग करें।

2

इस तथ्य के साथ कुछ करना है कि Last ऑपरेटर SQL सर्वर पर भेजने की कोशिश कर रहा है जिसमें कोई संबंधित आदेश नहीं है। एक बार समाधान आपके डीबी कॉल के अंत में ToArray() या Tolist() डालना है, जिससे यह एक डेटा को डेटा प्राप्त करने के लिए एक स्पष्ट कॉल बनाता है (अन्य सभी पंक्तियों पर लोडिंग को देखने के बजाए)।

12

Last बैक एंड डीबी द्वारा समर्थित नहीं है। आप अन्य तकनीकों की कोशिश करनी चाहिए:

  1. आपकी क्वेरी OrderByDescending का उपयोग कर चलाएँ तो अपने अनुसार आइटम पहले आता है।

  2. सामान्य रूप से अपनी LINQ क्वेरी को कोड करें, लेकिन इसे CLL2Sql को एक सीएलआर संग्रह में प्रस्तुत करने के लिए लागू करें और फिर आपके पास Last सहित स्थानीय रूप से सभी चीज़ों तक निःशुल्क पहुंच होगी। उदाहरण:

    var bills = purchaseBills.ToList(); 
    var last = bills.Last(); 
    
5

मैं LastOrDefault() का उपयोग न करने की कोशिश करता हूं क्योंकि कभी-कभी यह काम नहीं करता या समर्थन नहीं करता है। मैं iddesc द्वारा सॉर्ट कर रहा हूं और फिर पहले रिकॉर्ड प्राप्त कर रहा हूं।

.OrderByDescending(o=>o.id) 
.FirstOrDefault(s => s.Name == Name) 
+0

वही समस्या, मैंने ऑर्डरबाई अवरोही का उपयोग करने के लिए linq को स्विच किया, फिर LastorDefault के बजाय FirstOrDefault() का उपयोग किया। –

1

फिर भी एक और तरीका orderbydescending बिना पिछले तत्व हो और सभी संस्थाओं लोड:

var lastBill = purchaseBills 
    .Where(f => f.BillID == purchaseBills.Max(f2 => f2.BillID)) 
    .FirstOrDefault(); 
संबंधित मुद्दे