C# 创建子查询以根据窗口函数值进行筛选

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

我正在尝试将行数功能添加到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)
错误:

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不是完美的(有fake
TOP
子句),但至少是有效的。

您是如何从ThinkStructure重新构造其他所有内容以使其在3.1中工作的?我尝试了几种方法,但都没能成功。@迈尔斯,也许这段代码可以帮助你:
.Take(int.MaxValue)