2011-10-04 29 views
6

Giả sử tôi có một bảng chứa lịch sử giao hàng. Tôi muốn viết truy vấn tính số lượng lô hàng cho mỗi người dùng và nhận tên vận chuyển từ mục nhập gần đây nhất trong bảng cho người dùng đó.LINQ: Nhóm theo tổng hợp nhưng vẫn nhận được thông tin từ hàng gần đây nhất?

Bảng cấu trúc vì đơn giản: ShipmentID MemberID ShippingName ShippingDate

Làm thế nào để viết một LINQ truy vấn C# để làm điều này?

+0

"cho mỗi người dùng" u có nghĩa memberID? "mục nhập gần đây nhất" -> shippingDate? – Boomer

+0

@Boomer Có trên cả hai – Nate

Trả lời

5

Nghe có vẻ như có thể muốn một cái gì đó như:

var query = from shipment in context.ShippingHistory 
      group shipment by shipment.MemberID into g 
      select new { Count = g.Count(), 
        MemberID = g.Key, 
        MostRecentName = g.OrderByDescending(x => x.ShipmentDate) 
             .First() 
             .ShipmentName }; 
0

Không thực sự là một câu trả lời LINQ, nhưng cá nhân, tôi muốn được thả to SQL cho rằng, để đảm bảo nó không được làm bất kỳ N +1 vv; ví dụ:

select s1.MemberID, COUNT(1) as [Count], 
    (select top 1 ShippingName from Shipping s2 where s2.MemberID = s1.MemberID 
    order by s2.ShippingDate desc) as [LastShippingName] 
from Shipping s1 
group by s1.MemberID 

Bạn có lẽ có thể làm điều gì đó như LINQ (chưa được kiểm tra):

var qry = from row in data 
      group row by row.MemberId into grp 
      select new { 
       MemberId = grp.Key, 
       Count = grp.Count(), 
       LastShippingName = 
       grp.OrderByDescending(x => x.ShippingDate).First().ShippingName 
      }; 
Các vấn đề liên quan