【问题标题】:Add ROW_NUMBER to a LINQ query for specific Entity?将 ROW_NUMBER 添加到特定实体的 LINQ 查询?
【发布时间】:2015-02-28 15:56:37
【问题描述】:

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

我看过thisthis

目前我以这种方式工作:

    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 无法识别该方法 'System.Linq.IQueryable1[&lt;&gt;f__AnonymousType12[System.Int32,MyEntityType]] 选择[MyEntityType,f__AnonymousType12](System.Linq.IQueryable1[MyEntityType], System.Linq.Expressions.Expression1[System.Func3[MyEntityType,System.Int32,f__AnonymousType1`2[System.Int32,MyEntityType]]])' 方法,并且该方法不能翻译成商店表达式。

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

【问题讨论】:

    标签: c# .net linq entity-framework row-number


    【解决方案1】:

    A) 实体框架不支持ROW_NUMBER()(给出的示例使用 EF 生成查询,然后将数字“附加”到每个返回的行客户端,从 1 开始,如果有 n 行,则转到 n )

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

    SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY ID) RN FROM SomeTable WHERE ID = 100
    

    如果没有行,则返回 NULL;如果有 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 的视图/存储过程并从 EF 调用它

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多