C# 无法转换LINQ表达式-实体框架核心
我试图找到所有员工超过五名的部门。这就是我所尝试的:C# 无法转换LINQ表达式-实体框架核心,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,我试图找到所有员工超过五名的部门。这就是我所尝试的: public static string GetDepartmentsWithMoreThan5Employees(SoftUniContext context) { var departments = context .Departments .Where(d => d.Employees.Count > 5) .Select(d => new {
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表达式。我的假设是,这是由于外部选择后的排序。我怎样才能修好它
提前谢谢你 在
部门
类中,员工
的类型是什么
当OrderBy
与类型为ICollection
的成员一起使用时,可能会发生此错误
使用
列表
。当前答案建议导航属性部门。员工
应为列表
类型。这是不对的,它没有抓住要点。这里的观点几乎是相反的
首先,ICollection
对于导航属性来说非常好。官方实体框架文档中的许多示例都使用了它。此外,按计数
(不含()
)对此类导航属性进行排序也可以正常工作。当然还有Count()
异常消息类似于:
无法翻译查询[query text]。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算
不幸的是,目前EF core 3的异常情况太普遍了
子查询中添加的ToList()
就是罪魁祸首。删除它,并使用Count()
而不是Count
使其重新编译可能会*使异常消失:
var部门=上下文
.部门
.Where(d=>d.Employees.Count>5)//这里可以使用Count或Count()
.选择(d=>new
{
d、 名字,
ManagerFirstName=d.Manager.FirstName,
ManagerLastName=d.Manager.LastName,
雇员=d.雇员
.选择(e=>new
{
e、 名字,
e、 姓,
e、 职务
})
.OrderBy(e=>e.FirstName)
.ThenBy(e=>e.LastName)
})
.OrderBy(d=>d.Employees.Count())//这里是员工的编译时类型
//是IEnumerable,因此必须使用Count()
.ThenBy(d=>d.Name)
.ToList();
*我之所以说“可能”,是因为它在我测试过的一个类似查询中工作,但我不知道OP的类模型。您是否尝试过删除排序以测试您的假设并找出问题?是的,这是由于排序,但我看不出问题出在哪里。特别是,您是否尝试过将排序移动到
选择之前?看起来这不应该改变逻辑结果,但可能只是解决了问题。嗯,你真的需要具体化(.ToList()
)序列吗?尤其是内在的,我不确定什么时候应该实现,什么时候不应该。我现在正在学习EF核心。谢谢你的回复!这是ICollection
。这就是问题所在吗?将Employees
的类型更改为List
,然后查看它是否有效。编辑后:ICollection
是导航属性的推荐类型。这个答案是不正确的。这个问题一开始并不清楚,因为它缺少EXACT异常消息,并且在这两个消息之间进行了更改。甚至不清楚当前显示的查询是否仍然抛出此错误。