将 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__AnonymousType1
2[System.Int32,MyEntityType]]
Select[MyEntityType,<>f__AnonymousType12](System.Linq.IQueryable
1[MyEntityType],
System.Linq.Expressions.Expression1[System.Func
3[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
调用它
我需要一个 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.IQueryable
1[<>f__AnonymousType1
2[System.Int32,MyEntityType]] Select[MyEntityType,<>f__AnonymousType12](System.Linq.IQueryable
1[MyEntityType], System.Linq.Expressions.Expression1[System.Func
3[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