将最新的数据投影到linq查询中的项目

3

好的,这里是问题。

我有一个包含物品价格和时间的表格(实际上是视图,但无关紧要)。字段如下:

  • 物品名称
  • 价格
  • 时间戳。

其中还有其他需要访问的字段,例如列和一些计算出来的数字。这基本上是一个带有字段的对象,我们有一个非常长的表格(数百万行)。

我需要将物品名称列表与它们最近的价格连接起来,并且我想在 linq 中这样做。在纯 SQL 中,这已经不是一件有趣的事情了。我基本上寻找一个“视图”(可进一步合并的 IQueryable)定义,该定义仅包含给定物品名称的最新对象。然后可以使用 JOIN 语句与另一个过滤表(要显示价格的物品列表)进行连接。数据库设计是固定的第三方,因此无法通过重新设计来避免该问题。

在纯 SQL 中,我会定义一个包含 ItemName 和 Max(Timestamp)(按 ItemName 分组)的查询,然后自连接同一个表格以获取精确时间戳中的其他字段。

是否有任何好的方法在 LINQ 中处理这个问题呢?请用 Lambda 写,我不喜欢 SQL 风格的语法。

2个回答

0
在“Linq-to-objects”中,我会尝试这样做:
prices
    .GroupBy(p => p.ItemName)
    .Select(g => new {
                         Item = g.Key, 
                         LatestPrice = g.OrderByDescending(p => p.Timestamp).First()
                     });

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


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

是的,那就是我所说的自连接方法。我不能说我喜欢生成的 SQL ;( - TomTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接