c# - 无法翻译 LINQ 表达式 - 实体框架核心
问题描述
我正在尝试查找员工人数超过五人的所有部门。这是我尝试过的:
public static string GetDepartmentsWithMoreThan5Employees(SoftUniContext context)
{
var departments = context
.Departments
.Where(d => d.Employees.Count > 5)
.Select(d => new
{
d.Name,
ManagerFirstName = d.Manager.FirstName,
ManagerLastName = d.Manager.LastName,
Employees = d.Employees
.Select(e => new
{
e.FirstName,
e.LastName,
e.JobTitle
})
.OrderBy(e => e.FirstName)
.ThenBy(e => e.LastName)
.ToList()
})
.OrderBy(d => d.Employees.Count)
.ThenBy(d => d.Name)
.ToList();
return "";
}
出于某种原因,这总是会导致异常,指出无法翻译 LINQ 表达式。我的假设是这是由于外部选择之后的排序。我该如何解决?
先感谢您!
解决方案
当前答案表明导航属性Department.Employees
应该是 type List
。这是不正确的,它没有抓住重点。这里的观点几乎相反。
首先,ICollection
非常适合导航属性。它在官方实体框架文档中的许多示例中使用。Count
此外,按(不()
)此类导航属性的排序也可以正常工作。当然Count()
,还有。
异常消息类似于:
无法翻译查询 [查询文本]。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。
不幸的是,目前 EF core 3 的异常太常见了。
子查询中的ToList()
添加是这里的罪魁祸首。删除它,并使用Count()
而不是Count
让它再次编译可能会*使异常消失:
var departments = context
.Departments
.Where(d => d.Employees.Count > 5) // Count or Count() is fine here
.Select(d => new
{
d.Name,
ManagerFirstName = d.Manager.FirstName,
ManagerLastName = d.Manager.LastName,
Employees = d.Employees
.Select(e => new
{
e.FirstName,
e.LastName,
e.JobTitle
})
.OrderBy(e => e.FirstName)
.ThenBy(e => e.LastName)
})
.OrderBy(d => d.Employees.Count()) // Here, the compile-time type of Employees
// is IEnumerable<T>, so Count() must be used
.ThenBy(d => d.Name)
.ToList();
*我说“可能”是因为它适用于我测试过的类似查询,但我不知道 OP 的类模型。
推荐阅读
- ruby - 在 Ruby 中修改参数
- jmeter - 使用 JMeter 模拟浪涌/突发请求
- html - CSS 过渡口吃,但仅在我的 60hz 显示器上
- java - 更改执行器聚合的健康状态行为
- html - 带有colspan的td元素问题的引导边界
- spring-boot - Spring Boot Devtools Remote 导致 Pivotal Cloud Foundry 出现错误
- ruby - Google Drive API“评论者”权限失败,但所有其他人工作
- string - \Symfony\Component\String\Slugger\AsciiSlugger 实现 \Symfony\Contracts\Translation\LocaleAwareInterface?
- javascript - 在 Google Cloud 上运行 Node JS 脚本的最佳方式
- performance-testing - Cumulative Layout Shift 是否停止测量用户交互?