C# 如何使用实体框架根据max版本选择多条记录
我有这样的记录C# 如何使用实体框架根据max版本选择多条记录,c#,sql,entity-framework,linq,C#,Sql,Entity Framework,Linq,我有这样的记录 id name number version --------------------------- 1 NewYork 1 1 2 LosAngeles 1 2 3 Seatle 1 3 4 Toronto 2 1 5 Ottawa 2 2 SELECT * FROM city c WHERE c.[version] = (SELECT Max([version
id name number version
---------------------------
1 NewYork 1 1
2 LosAngeles 1 2
3 Seatle 1 3
4 Toronto 2 1
5 Ottawa 2 2
SELECT *
FROM city c
WHERE c.[version] = (SELECT Max([version])
FROM [city] c2
WHERE c2.number = c.number)
我只想选择同一编号内版本最高的记录
所以我写了这样的查询
id name number version
---------------------------
1 NewYork 1 1
2 LosAngeles 1 2
3 Seatle 1 3
4 Toronto 2 1
5 Ottawa 2 2
SELECT *
FROM city c
WHERE c.[version] = (SELECT Max([version])
FROM [city] c2
WHERE c2.number = c.number)
它会回来的
id name number version
---------------------------
3 Seatle 1 3
5 Ottawa 2 2
我如何使用实体框架在linq中编写它
db.cities.where(c => c.version == (????))
我不知道实体框架如何处理这个问题。使用
GroupBy
按编号进行分组,然后使用OrderBy
对版本最高的记录进行分组:
var maxVersionCities = db.cities
.GroupBy(c => c.number)
.Select(grp => grp
.OrderByDescending(c => c.version)
.First())
.SelectMany(grp => grp);
var result = db.cities.GroupBy(item => item.number)
.Select(grouping => grouping.OrderByDescending(item => item.version)
.First());
不需要第二组。。而且也不会起作用。您需要执行SelectMany(grp=>grp.SelectMany(inner=>inner))
。。。在更正后,这基本上就是我的答案…@GiladGreen如果多个城市拥有相同数量的最高版本呢?我不可能在表编号+版本上使其唯一,我知道使用groupby it工作。但当我在实体框架中使用groupby时,它似乎要慢得多。当查询运行一瞬间时,回调实际上需要5秒钟。有什么原因可以解释为什么groupby比实体框架中的查询本身慢得多。@nanobots-如果您的查询慢,请查看linq生成的查询是什么,并检查执行计划。你可能想在你分组的字段上添加索引——在本例中是number
是的,我想我会尝试一下。可能只是实体框架的初始初始化overhead@nanobots-即使有了EF db logic的魔力,也需要调整代码和数据库,使其相互适合,并符合要求。顺便说一句-请参阅UpdateNoOriginalSQL实际返回正确的结果。它已经过测试。这似乎是一个sql问题,如果您在内部查询中选择max,它将返回唯一编号上的所有max版本。一开始我也很惊讶,但它确实有效。反复测试。返回的结果表实际上是基于我最初的查询返回的结果。为什么我们最后需要selectMany?它似乎返回了一个记录列表,而没有我感觉到的selectMany