2012-04-05 91 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