我正在寻找所有拥有五名以上员工的部门。这是我尝试过的:
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表达式。我的假设是这是由于外部选择之后的排序。我该如何解决?
提前谢谢!
答案 0 :(得分:0)
当前答案表明导航属性Department.Employees
的类型应为List
。这是不正确的,并且遗漏了重点。这里的要点几乎相反。
首先,ICollection
非常适合导航属性。官方Entity Framework文档中的许多示例中都使用了它。另外,按Count
(不使用()
)的导航属性排序也可以。当然还有Count()
。
该异常消息类似于:
查询[查询文本]无法翻译。可以以可翻译的形式重写查询,也可以通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估。
不幸的是,目前在EF核心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的类模型。
答案 1 :(得分:-1)
Employees
类中的Department
是什么类型?
当OrderBy
类型的成员使用ICollection
时,会发生此错误。
改为使用List
。