C# 创建子查询以根据窗口函数值进行筛选
我正在尝试将行数功能添加到EF Core,并通过它进行过滤 添加自定义函数后,它在C# 创建子查询以根据窗口函数值进行筛选,c#,entity-framework-core,ef-core-3.1,entity-framework-core-3.1,C#,Entity Framework Core,Ef Core 3.1,Entity Framework Core 3.1,我正在尝试将行数功能添加到EF Core,并通过它进行过滤 添加自定义函数后,它在Select中工作正常,但在Where中不工作,因为SQL格式不正确 林克: 翻译成: SELECT i.NAME, ROW_NUMBER() OVER(ORDER BY i.ProductId) AS RowNumber FROM OrderItems AS i WHERE ROW_NUMBER() OVER(ORDER BY i.ProductId) = CAST(1 AS bigint
Select
中工作正常,但在Where
中不工作,因为SQL格式不正确
林克:
翻译成:
SELECT
i.NAME,
ROW_NUMBER() OVER(ORDER BY i.ProductId) AS RowNumber
FROM
OrderItems AS i
WHERE
ROW_NUMBER() OVER(ORDER BY i.ProductId) = CAST(1 AS bigint)
错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Windowed functions can only appear in the SELECT or ORDER BY clauses.
要更正此SQL,我需要创建一个子查询:
SELECT
t.NAME,
t.RowNumber
FROM (
SELECT
i.NAME,
ROW_NUMBER() OVER(ORDER BY i.ProductId) AS RowNumber
FROM
OrderItems AS i
) t
WHERE
t.RowNumber = CAST(1 AS bigint)
我在EF Core 2中找到了一篇关于如何做到这一点的文章
也许,最简单的方法是引入一个方法,该方法给EF一个提示,即前一个查询应该是一个子查询。幸运的是,我们没有做太多的工作,因为在内部,方法AsQueryable(或者与其关联的表达式)就是这样做的
但这种方法在EF Core 3.1中没有任何作用
有创建子查询的方法吗?查看EF Core 3.1源代码,在应用
过滤器之前,我看到的唯一强制子查询的方法是引入查询限制(即跳过和/或接受)
从两个可能的伪极限运算符(Skip(0)
和Take(int.MaxValue)
)来看,选择后者更好,因为前者也需要一些排序(甚至是伪)
因此,解决方法是插入
.Take(int.MaxValue)
在之前。其中(…)
生成的SQL不是完美的(有fakeTOP
子句),但至少是有效的。您是如何从ThinkStructure重新构造其他所有内容以使其在3.1中工作的?我尝试了几种方法,但都没能成功。@迈尔斯,也许这段代码可以帮助你:
.Take(int.MaxValue)