![](/img/trans.png)
[英]Entity Framework Core Throwing Exception: The LINQ expression could not be translated with PostgreSQL
[英]The LINQ expression could not be translated - Entity Framework Core
我正在尝试查找员工人数超过五人的所有部门。 这是我尝试过的:
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 表达式。 我的假设是这是由于外部 select 之后的排序。 我该如何解决?
先感谢您!
当前的答案表明导航属性Department.Employees
应该是List
类型。 这是不正确的,它没有抓住重点。 这里的观点几乎相反。
首先, ICollection
非常适合导航属性。 它在官方实体框架文档中的许多示例中使用。 此外,按此类导航属性的Count
(不带()
)排序也可以正常工作。 当然,还有Count()
。
异常消息类似于:
无法翻译查询 [查询文本]。 以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。
不幸的是,目前 EF core 3 的异常太常见了。
子查询中的ToList()
添加是这里的罪魁祸首。 删除它,并使用Count()
而不是Count
再次编译它可能会*使异常 go 消失:
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 的 class model。
class Department
的Employees
类型是什么?
当OrderBy
与ICollection
类型的成员一起使用时,可能会发生此错误。
请改用List
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.