2012-04-05 31 views
8

Tôi có cấu trúc dữ liệuhồ sơ LINQ to chọn mới nhất

enter image description here

Đối với mỗi mục có một kỷ lục của nó giá vào một ngày nhất định trong mỗi loại tiền tệ. Tôi cần phải tạo một truy vấn trả về giá mới nhất cho mỗi loại tiền tệ.

Truy vấn này hoạt động, nhưng trả lại nhiều Amounts cho ID tiền tệ 1. Nó chỉ nên trả về 3 bản ghi, 7,8 and 9 vì các giá trị này đại diện cho giá cập nhật nhất trong tất cả đơn vị tiền tệ cho mặt hàng này.

var q = (from c in db.tblStoreItemPrices where c.ItemID == ID select new { c.CurrencyID, c.Amount }); 

Vui lòng bỏ qua tất cả các đơn đặt hàng và cho rằng các hồ sơ được sắp xếp ngẫu nhiên.

Cảm ơn bạn đã trợ giúp!

+0

"giả định rằng các bản ghi được sắp xếp ngẫu nhiên" . – KingCronus

Trả lời

27

này nên làm việc:

db.tblStoreItemPrices 
    .Where(c => c.ItemID == ID) 
    .GroupBy(c => c.CurrencyID) 
    .Select(g => g.OrderByDescending(c => c.Date).First()) 
    .Select(c => new { c.CurrencyID, c.Amount }); 

Giải thích:

  1. Chọn hàng cho cụ ItemID
  2. Đoàn tự do CurrencyID
  3. Từ trong mỗi nhóm tệ chọn hàng có nhiều nhất ngày gần đây (để lại một hàng cho mỗi CurrencyID trong tập kết quả)
  4. Kéo ra thông tin điện tử bạn muốn từ các hàng này
+1

Cảm ơn - đây là một trợ giúp tuyệt vời. Trong ASP.NET MVC 5 nó đã được chỉ là vấn đề với đầu tiên - sau khi thay đổi để FirstOrDefault nó đã được làm việc tuyệt vời. Cảm ơn một lần nữa :) – Tunerx

+0

thay vì sau đó orderByDescending dựa trên ngày, làm orderByDescending trên id, bởi vì id có lẽ được lập chỉ mục và liên kết với dữ liệu mới nhất, do đó truy vấn sẽ nhanh. –

+0

nhưng trong trường hợp cột ngày đã được lập chỉ mục thì nó vẫn ổn –

Các vấn đề liên quan