2009-03-13 15 views
25

में मैं कुछ इस तरह है: एकLINQ एसक्यूएल .sum() समूह के बिना करने के लिए ...

itemsCart.Sum() //not sure what to pass into the function 

करने के लिए ओ की राशि प्राप्त करने के लिए किसी भी तरह से

var itemsInCart = from o in db.OrderLineItems 
        where o.OrderId == currentOrder.OrderId 
        select new { o.OrderLineItemId, ..., ..., o.WishListItem.Price} 

है। WishListItem.Price या क्या मुझे समूह के साथ डेटाबेस से एक और iQueryable < टी> प्राप्त करना है?

उत्तर

52

के बारे में क्या:

itemsInCart.AsEnumerable().Sum(o=>o.Price); 

AsEnumerable फर्क नहीं पड़ता, इस क्वेरी (वस्तुओं के लिए LINQ) स्थानीय स्तर पर निष्पादित करेंगे।

+0

से एक और IQueryable < T> प्राप्त करना नहीं चाहता था, यह भी बेहतर है, thanx –

15

आप कर सकते हैं:

itemsCart.Select (ग => c.Price) .sum();

केवल एक बार डाटाबेस हिट करने के लिए कार्य करें:

var itemsInCart = (from o in db.OrderLineItems 
        where o.OrderId == currentOrder.OrderId 
        select new { o.OrderLineItemId, ..., ..., o.WishListItem.Price} 
       ).ToList(); 
var sum = itemsCart.Select(c=>c.Price).Sum(); 

अतिरिक्त राउंड ट्रिप बचाया लायक है यह :)

+0

अभिव्यक्ति का अनुवाद नहीं कर सका '(...)। चुनें (o => o.Price) .Sum()' एसक्यूएल में और स्थानीय अभिव्यक्ति के रूप में इसका इलाज नहीं कर सका। –

+0

आइटम का प्रयास करें कार्ड। टोलिस्ट()। चुनें (सी => सी। प्रिसेस) .Sum(); –

+0

@rm अगर आपको वैसे भी जानकारी मिल रही है, जैसा कि जोनाथन ने उल्लेख किया है (एक चर पर सूची को सहेजें, ताकि आपको केवल एक बार डेटा मिल सके)। – eglasius

7

प्रयास करें:

itemsCard.ToList().Select(c=>c.Price).Sum(); 

वास्तव में इस बेहतर प्रदर्शन करेंगे:

var itemsInCart = from o in db.OrderLineItems 
       where o.OrderId == currentOrder.OrderId 
       select new { o.WishListItem.Price }; 
var sum = itemsCard.ToList().Select(c=>c.Price).Sum(); 

क्योंकि आप केवल डेटाबेस से एक कॉलम पुनर्प्राप्त करेंगे।

+0

आपको +1 रखना होगा :) –

+0

मुझे अन्य चीजों के लिए अन्य कॉलम चाहिए, यही कारण है कि मैं डीबी –

1

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

var itemsInCart = from o in db.OrderLineItems 
       where o.OrderId == currentOrder.OrderId 
       select o.WishListItem.Price; 

return (Convert.ToDecimal(itemsInCart.Sum())); 

मुझे लगता है कि इसे और अधिक आसान है!

अभी तक।

1

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन तुम क्यों ऐसा लगता है कि ऐसा नहीं कर सकते: मैं कैसे क्वेरी अभिव्यक्ति का उपयोग करते यह करने के लिए यकीन नहीं है

db.OrderLineItems.Where(o => o.OrderId == currentOrder.OrderId).Sum(o => o.WishListItem.Price); 

+0

यह शून्य प्रतिक्रिया होगी कोई पंक्ति नहीं मिली, इसलिए आपको उपयोग करना होगा .अनुक्रमिक()। Sum (o => o.Price) –

+0

@EugeneBosikov जैसा कि अन्य उत्तरों में उल्लेख किया गया है, 'AsEnumerable' को LINQ सर्वर से पूरे डेटा सेट को पुनर्प्राप्त करने का कारण बन जाएगा और इसे स्थानीय रूप से समेकित करें, जो डेटाबेस को काम करने से बहुत कम कुशल है।साथ ही, जिस तरह से LINQ काम करता है, आपको शून्य संदर्भ त्रुटि नहीं मिलेगी क्योंकि यह निष्पादन पथ बना रहा है, और वास्तव में कोई काम नहीं करता है जब तक कि आप परिणामों को किसी नए संग्रह में आउटपुट न करें। – Trisped

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