2009-03-13 38 views
25

Tôi có một cái gì đó như thế này:LINQ to SQL .Sum() mà không cần nhóm ... vào

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

là có cách nào để làm một

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

để có được tổng của o. WishListItem.Price hoặc tôi có để có được một iQueryable < T> từ cơ sở dữ liệu với nhóm ... vào?

Trả lời

52

gì về:

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

AsEnumerable nên sự khác biệt, truy vấn này sẽ thực hiện tại địa phương (LINQ to Objects).

+0

thậm chí còn tốt hơn, thanx –

15

bạn có thể:

itemsCart.Select (c => c.Price) .Sum();

Để nhấn db chỉ một lần làm:

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(); 

Các phụ khứ hồi lưu là giá trị nó :)

+0

Không thể dịch biểu thức '(...). Chọn (o => o.Giá) .Sum()' thành SQL và không thể coi nó là biểu thức cục bộ. –

+0

Thử các mụcCard.ToList(). Chọn (c => c.Price) .Sum(); –

+0

@rm nếu bạn đang nhận được thông tin anyway, làm như Jonathan đã đề cập (lưu danh sách trên một biến, vì vậy bạn chỉ nhận được dữ liệu một lần). – eglasius

7

Hãy thử:

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

Trên thực tế điều này sẽ thực hiện tốt hơn:

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(); 

Vì bạn sẽ chỉ lấy một cột từ cơ sở dữ liệu.

+0

bạn có thể giữ +1 :) –

+0

Tôi cần các cột khác cho những thứ khác, đó là toàn bộ lý do tôi không muốn nhận một IQueryable < T> từ DB –

1

Hãy thử điều này:

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

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

Tôi nghĩ rằng nó đơn giản hơn!

Đến bây giờ.

1

Tôi biết đây là một câu hỏi cũ nhưng tại sao bạn không thể làm điều đó như:

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

Tôi không chắc chắn làm thế nào để làm điều này sử dụng biểu thức truy vấn.

+0

nó sẽ là lỗi vô trách nhiệm Nếu không tìm thấy hàng nào, vì vậy bạn phải sử dụng .AsEnumerable(). Sum (o => o.Price) –

+0

@EugeneBosikov Như đã lưu ý trong các câu trả lời khác, việc thêm 'AsEnumerable' sẽ khiến LINQ truy xuất toàn bộ tập dữ liệu từ máy chủ và tổng hợp nó cục bộ, ít hiệu quả hơn việc có cơ sở dữ liệu thực hiện công việc.Ngoài ra, cách LINQ hoạt động, bạn sẽ không nhận được lỗi tham chiếu null vì nó đang xây dựng đường dẫn thực thi và không thực sự thực hiện bất kỳ công việc nào cho đến khi bạn xuất kết quả vào bộ sưu tập mới. – Trisped