LINQ to Entities 无法识别方法 'System.Linq.IQueryable'
本文关键字:Linq IQueryable System 方法 Entities to 识别 LINQ | 更新日期: 2023-09-27 18:31:09
我想运行这个 LINQ 简单代码以在 LINQ 中拥有记录号,但结果低于错误
var model = _db2.Persons.Select(
(x, index) => new
{
rn = index + 1,
col1 = x.Id
}).ToList();
错误:
LINQ to 实体无法识别该方法 '系统.Linq.IQueryable
1[<>f__AnonymousType2
2 [System.Int32,System.Int32]]选择[人,<>f__AnonymousType22](System.Linq.IQueryable
1 [MvcApplication27.Models.Person], System.Linq.Expressions.Expression1[System.Func
3 [MvcApplication27.Models.Person,System.Int32,<>f__AnonymousType2'2 [System.Int32,System.Int32]]])'方法,并且此方法无法转换为存储 表达。
问题是 LINQ to Entities 不了解如何将Select
重载(为您提供索引的重载)转换为 SQL 查询。您可以通过首先从数据库中选择所需的部分(以避免不必要地选择每一列),然后执行AsEnumerable()
将其作为IEnumerable<T>
而不是IQueryable<T>
,然后纯粹在 C# 中执行Select
(简而言之,IQueryable<T>
转换为 SQL,而IEnumerable<T>
在代码中运行)。
var model = _db2.Persons.Select(x => x.Id).AsEnumerable().Select(
(id, index) => new
{
rn = index + 1,
col1 = id
}).ToList();
请注意,您拥有的查询似乎是无序的,因此每次调用此查询时,id/索引对都会更改。如果你期望一致性,你应该按某些东西排序(例如 _db2.Persons.OrderBy(...)
)。
编辑
添加斯科特的评论:
作为一个很好的参考,这里有所有内置的 Linq 语句的列表 框架和列表是否兼容。
您只需选择 Id,然后在它之后使用 linq to 对象创建您自己的匿名对象,例如:
var model = _db2.Persons.Select(x => x.Id)
.ToList() // return int[]
.Select((id, index) => new
{
rn = index + 1,
col1 = id
}) // return anonymous[] (with rn and col1)
.AsEnumerable(); // get an IEnumerable (readonly collection)
发生这种情况可能是因为实体框架不支持使用 linq 的这种查询,因为 linq 可以在内存中执行,因此,在这种情况下,您可以选择只需要(在您的情况下id
)并执行它,使用ToList()
方法具体化您的查询,之后您将在内存上有一个列表, 因此,可以使用 LINQ To 对象,并根据需要使用支持的方法。