【问题标题】:How to do select multiple records based on max version using Entity Framework如何使用实体框架根据最大版本选择多个记录
【发布时间】:2017-04-27 01:34:41
【问题描述】:

我有这样的记录

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

如何使用 Entity Framework 在 linq 中编写它?

db.cities.where(c => c.version == (????))

我不知道 Entity Framework 将如何工作。

【问题讨论】:

    标签: c# sql entity-framework linq


    【解决方案1】:
    var maxVersionCities = db.cities
        .GroupBy(c => c.number)
        .Select(grp => grp
            .OrderByDescending(c => c.version)
            .First())
        .SelectMany(grp => grp);
    

    【讨论】:

    • 不需要第二个分组..也行不通。你需要做SelectMany(grp => grp.SelectMany(inner => inner))...在更正之后,这基本上就是我的答案...
    • @GiladGreen 如果多个城市的同一个数字也有相同的最高版本怎么办?
    • 不可能我让它在表号+版本上唯一
    • 我知道使用 groupby 可以。但是,当我在实体框架中使用 groupby 时,它看起来要慢得多。当查询运行时,回调实际上需要大约 5 秒。为什么 groupby 比实体框架中的查询本身慢得多。
    【解决方案2】:

    使用GroupBynumber分组,然后OrderByversion最高的记录:

    var result = db.cities.GroupBy(item => item.number)
                          .Select(grouping => grouping.OrderByDescending(item => item.version)
                                                      .First());
    

    【讨论】:

    • @nanobots - 如果您的查询很慢,请查看 linq 生成的查询是什么并检查执行计划。您可能希望在分组依据的字段上添加索引 - 在本例中为 number
    • 是的,我想我会试一试。也许只是实体框架初始开销中的初始化
    • @nanobots - 即使有 EF db 逻辑的魔力,也需要对代码和数据库进行调整和调整以适应彼此和需求。顺便说一句 - 查看更新
    • 没有原始 sql 实际上返回正确的结果。它已经过测试。如果您在内部查询中选择 max,这似乎是一个 sql 事情,它将返回唯一编号的所有最大版本。起初它也让我感到惊讶,但它确实有效。一遍又一遍地测试它。返回的结果表实际上是基于我原来的查询返回的。
    • 为什么我们最后需要 selectMany 它似乎返回了一个记录列表而没有我感觉的 selectMany
    猜你喜欢
    • 2012-02-19
    • 2022-08-18
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2021-03-02
    • 2021-06-30
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多