Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法转换LINQ表达式-实体框架核心_C#_Linq_Entity Framework Core - Fatal编程技术网

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异常消息,并且在这两个消息之间进行了更改。甚至不清楚当前显示的查询是否仍然抛出此错误。