Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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
C# 如何使用实体框架根据max版本选择多条记录_C#_Sql_Entity Framework_Linq - Fatal编程技术网

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