我有以下的GROUP BY:
var stocks =
from p in products
from w in p.Warehouses
from l in w.locations
group l by l.Date into g
let maxDate = g.Max(l1 => l1.Date)
select new { Product=p.Name, Location= g.Where(l2 => l2.Date == maxDate) };
但它不起作用,我想是因为我正在执行group by,所以我不允许在select中使用group by之前使用表中的值。
下面是对象的层次结构。
Products
Each product has multiple warehouses
Each warehouse has multiple locations.
我需要返回所有产品,每个产品必须包含位置名称。
当存在多个仓库和多个位置时,查找位置的标准是什么?
我必须搜索每个仓库,依次搜索每个地点...并返回我使用Date == maxDate
检测到的最新位置(只有1个)。
但它不会让我选择p中的"Name“。它不在g中,因为g是由"locations”组成的。
发布于 2011-04-01 19:50:31
我认为你想要这样的东西:
var query = from product in products
let location = (from warehouse in p.Warehouses
from location in p.Locations
orderby location.Date descending
select location).FirstOrDefault()
select new { Product = product.Name,
Location = location };
请注意,如果没有匹配的位置,则Location
可能为空。
这里不需要使用let
子句,但我认为这将是编写查询的最具可读性的方式。
当然,现在您并不需要对所有位置进行排序。但是LINQ中没有MaxBy
,这才是你真正想要的。如果你正在使用LINQ to Objects,你可以编写你自己的MaxBy
方法(在MoreLINQ中有一个);在LINQ to SQL等等中,我希望数据库无论如何都能优化查询。
https://stackoverflow.com/questions/5512580
复制相似问题