2012-04-05 92 views
8

我有數據結構LINQ到選擇最新的記錄

enter image description here

對於每個項目有它的記錄的價格在每一種貨幣某一日期。我需要創建一個查詢來返回每種貨幣的最新價格。

此查詢適用,但返回多個Amounts,貨幣ID爲1。它應該只返回3條記錄,7,8 and 9,因爲這些記錄表示該項目的所有貨幣的最新價格。

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

請忽略所有排序,並假定記錄是隨機排列的。

感謝您的幫助!

+0

你想E資料「假設記錄隨機排序」 ,豈不更有意義比主鍵以外的聚集索引,以單獨減少這種random'ness性能。 – KingCronus 2012-04-05 10:36:47

回答

27

這應該工作:

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

說明:

  1. 針對具體項目ID
  2. 組選擇行通過CurrencyID
  3. 從各貨幣組中選擇具有最行最近日期(在結果集中爲每個CurrencyID留下一行)
  4. 拔出從這些行
+1

謝謝 - 這是一個很大的幫助。在ASP.NET MVC 5中,這只是First的問題 - 在更改爲FirstOrDefault之後,它工作得很好。再次感謝:) – Tunerx 2014-03-12 20:17:35

+0

而不是orderByDescending基於日期,做ID爲orderByDescending,因爲ID最有可能編入索引並與最新數據相關聯,因此查詢將會很快。 – 2017-08-25 03:53:57

+0

但incase列日期已被索引,那麼它很好 – 2017-08-25 03:55:01