entity-framework - 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();
}
如何转换该代码?
解决方案
你的问题是:
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()
推荐阅读
- highcharts - Highcharts 绘制 MACD + EMA + 交易量
- c# - 脚本错误:NullReferenceException:downloadhandler.data
- java - 从一个 MySQL 数据库表中选择并使用 Java 在另一个数据库表中批量插入 || 批量插入不起作用
- python - 使用另一个数据框作为列引用的数据框查找
- visual-studio-code - 使用 vs code 删除文件夹中的所有文件,这些文件不是由另一个文件夹中的文件导入的
- arduino - Arduino Uno 上的“引脚更改”中断在哪里?
- javascript - 为什么 react-monaco-editor 不支持像 componentDidUpdate 这样的 API
- javascript - 使用新 Firebase 9.0 的问题
- r - 在 R 中组合数据名的列
- python - 如何找到修改后的原始 ROI 的 ROI 位置?