仅将最新数据投影到linq查询中

时间:2011-06-13 08:20:04

标签: linq

好的,这是问题所在。

我有一张桌子(实际上是一个视图,但它无关紧要)包含一个项目的价格。字段:

  • ITEMNAME
  • 价格
  • 时间戳。

此处还有其他字段,也必须可以访问。像列和一些计算数字的东西。这基本上是一个带字段的对象,我们有一个很长的表(数百万行)。

我需要以最新价格加入项目名称列表,我想在linq中这样做。在纯SQL中,这已经不好玩了。我基本上寻找一个“视图”(IQueryable进一步合并)定义,它只包含给定项目名称的最新对象。然后,这允许将JOIN语句与另一个过滤表(要显示价格的项目列表)一起使用。数据库设计是固定的第三方,因此重新设计无法避免这个问题。

在纯SQL中,我将定义一个包含ItemName和Max(Timestamp)(按ItemName分组)的查询,然后使用相同的表自我加入以获取其他字段以获取确切的时间戳。

知道如何在LINQ中做到最好吗? Lambda请,我不喜欢sql风格的语法。

2 个答案:

答案 0 :(得分:0)

Linq-to-objects我会试试这个:

prices
    .GroupBy(p => p.ItemName)
    .Select(g => new {
                         Item = g.Key, 
                         LatestPrice = g.OrderByDescending(p => p.Timestamp).First()
                     });

虽然我不确定它是否会正确映射到SQL。

答案 1 :(得分:0)

此请求也可以完成这项工作:

var v = from product in Products
    join recentProduct in
        (from _product in Products
         group _product by _product.Name into _products
         select new { Name = _products.Key, TimeStamp = _products.Max(s => s.TimeStamp) })
    on new { product.Name, product.TimeStamp } equals new { recentProduct.Name, recentProduct.TimeStamp }
    select product);