在 EF Core 中加入子查询

问题描述 投票:0回答:1

目标:我想选择给定表的最新版本记录:

id 版本 名字
1 0 阿历克
1 1 亚历克斯
2 0 鲍勃

注意:时态数据特征是不行的。

理想情况下,这就是我希望 EF Core 使用 CTE 生成的内容:

WITH cte (Id, Version) AS 
(
    SELECT 
        Id, MAX(Version)
    FROM 
        Table
    GROUP BY 
        Id
)
SELECT a.*
FROM Table a
JOIN cte ON a.Id = cte.Id AND cte.Version = e.Version;

注意:如果上述查询在 EF Core 中不可能,这里有一个替代但等效的查询:

SELECT a.*
FROM (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Version DESC) rn
    FROM Table a
    WHERE redacted
) a
WHERE a.rn = 1;

C# LINQ 查询:

var query = (from a in context.Test
            join j in (from m in context.Test
                        group m by m.Id
                        into g
                        select new { g.Key, Version = g.Max(x => x.Version) })
            on new { a.Id, a.Version } equals new { Id = j.Key, j.Version } into gj
            select a).ToQueryString();

ISSUE:实际生成的SQL查询完全错过了子查询:

SELECT [a].[Id], [a].[Version]
FROM [Employer] AS [e]
c# sql entity-framework-core common-table-expression window-functions
1个回答
0
投票

在 EF Core 中执行行号查询的最正确方法是让它自行解决

var query = 
    context.Test
    .GroupBy(t => t.Id)
    .Select(g => g.OrderByDescending(t => t.Version).FirstOrDefault());

我不确定为什么连接查询不起作用,但无论如何它都不是很有效。

© www.soinside.com 2019 - 2024. All rights reserved.