目标:我想选择给定表的最新版本记录:
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]
在 EF Core 中执行行号查询的最正确方法是让它自行解决
var query =
context.Test
.GroupBy(t => t.Id)
.Select(g => g.OrderByDescending(t => t.Version).FirstOrDefault());
我不确定为什么连接查询不起作用,但无论如何它都不是很有效。