Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅将最新数据投影到linq查询中_Linq - Fatal编程技术网

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

仅将最新数据投影到linq查询中,linq,Linq,好的,问题来了 我有一个表(实际上是一个视图,但它是不相关的),其中包含某个时间项目的价格。字段: 项目名称 价格 时间戳 此字段中还有其他字段,这些字段也必须是可访问的。比如列和一些计算过的数字。这基本上是一个带有字段的对象,我们有一个相当长的表(数百万行) 我需要加入一个项目名称列表,列出它们的最新价格,我想在linq中这样做。在纯SQL中,这已经不好玩了。我基本上是寻找一个“视图”(IQueryable用于进一步合并)定义,该定义只包含给定项名称的最新对象。这样就可以将JOIN语句与另

好的,问题来了

我有一个表(实际上是一个视图,但它是不相关的),其中包含某个时间项目的价格。字段:

  • 项目名称
  • 价格
  • 时间戳
此字段中还有其他字段,这些字段也必须是可访问的。比如列和一些计算过的数字。这基本上是一个带有字段的对象,我们有一个相当长的表(数百万行)

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

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


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

Linq to objects
中,我会尝试以下方法:

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

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

此请求也会完成此任务:

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