将 ROW_NUMBER 添加到特定实体的 LINQ 查询?

Add ROW_NUMBER to a LINQ query for specific Entity?

我需要一个 EF 查询来获取特定实体的行号。

我看过 this, and this

目前我是这样工作的:

    private DbContext Context;
    public int GetRowNumberQuery<TEntity>(int entityId)
    {
        var allEntities = this.Context.Set<TEntity>().ToList();

        return allEntities
            .Select((entity, index) => new { Index = index, Entity = entity })
            .Where(x => x.Entity.Id == entityId)
            .Select(x => x.Index)
            .SingleOrDefault();
    }

显然,这是非常低效的,因为它在选择索引之前获取所有实体的列表。如果我删除第一行中的 .ToList() ,使整个事情成为 LINQ 查询,它会在第一个 Select 处失败,并显示 NotSupportedException 说:

LINQ to Entities does not recognize the method 'System.Linq.IQueryable1[<>f__AnonymousType12[System.Int32,MyEntityType]] Select[MyEntityType,<>f__AnonymousType12](System.Linq.IQueryable1[MyEntityType], System.Linq.Expressions.Expression1[System.Func3[MyEntityType,System.Int32,<>f__AnonymousType1`2[System.Int32,MyEntityType]]])' method, and this method cannot be translated into a store expression.

你能告诉我如何获得特定实体的 ROW_NUMBER 吗? 还是像 this 很老的问题所暗示的那样不可能?

A) Entity Framework 不支持 ROW_NUMBER()(给出的示例使用 EF 生成查询,然后 "attach" 每个 returned 行客户端的数字边,从1开始,如果有n行就到n)

B) 即使在 TSQL 中,查询也会很复杂:

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY ID) RN FROM SomeTable WHERE ID = 100
如果没有行,

会returnNULL,如果有 ID 为 100 的行

1

你需要像

这样的东西
SELECT B.RN 
    FROM 
        (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) RN 
            FROM SomeTable) B 
    WHERE B.ID = 100

C) 显然您可以创建一个使用 ROW_NUMBER 的 view/stored 过程并从 EF

调用它