首页 > 解决方案 > EF Core 更新无法翻译 LINQ 表达式“x”

问题描述

我将 .net core 2.2 更新为 5

我有一个关于 ef 的错误

System.InvalidOperationException:“无法翻译 LINQ 表达式“x”。以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038

public List<CustomerPageModel> GetCustomers(int AccountID)
        {
            return (from p in context.Customers
                    join f in context.Patients on p.ID equals f.CustomerID into ps
                    from t in ps.DefaultIfEmpty()
                    where p.AccountID == AccountID
                    select new CustomerPageModel
                    {
                        ID = p.ID,
                        Name = p.Name,
                        IsActive = p.IsActive,
                        TC = p.TC,
                        Surname = p.Surname,
                        Email = p.Email,
                        Address = p.Address,
                        Phone = p.Phone,
                        Note = p.Note,
                        AccountID = p.AccountID,
                        Pats = string.Join(",", ps.Select(x => x.Name)),
                        PatCount = ps.Count()
                    })
            .GroupBy(p => p.ID)
            .Select(g => g.First())
           .ToList();
        }

如何转换该代码?

标签: entity-frameworkasp.net-core-5.0

解决方案


你的问题是:

Pats = string.Join(",", ps.Select(x => x.Name)),

具体来说,该string.Join方法不会转换为 SQL,因此在早期版本的 EF 中,它必须从数据库中检索数据,然后在内存中执行string.Join函数。现在 EF 明确告诉您它不能在数据库服务器上运行它 - 这是一个重大更改,但一个设计决定告诉您(开发人员)它可能没有像您想象的那样高效运行......

要“解决”这个问题,并根据您的特定代码示例,我建议以下内容:

将宠物名称数组属性添加到您的 CustomerPageModel:

public string[] PetNames {get;set;}

并将Pets属性转换为只读计算字符串:

public string Pets { get => string.Join(",", PetNames); }

并将 LINQ 表达式中的问题行更改为:

PetNames = ps.Select(x => x.Name).ToArray()


推荐阅读