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__AnonymousType2 2](System.Linq.IQueryable 1 [MvcApplication27.Models.Person], System.Linq.Expressions.Expression 1[System.Func 3 [MvcApplication27.Models.Person,System.Int32,<>f__AnonymousType2'2 [System.Int32,System.Int32]]])'方法,并且此方法无法转换为存储 表达。

LINQ to Entities 无法识别方法 'System.Linq.IQueryable'

问题是 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 对象,并根据需要使用支持的方法。