LINQ表达式无法翻译-Entity Framework Core

时间:2020-08-06 10:20:21

标签: c# linq 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表达式。我的假设是这是由于外部选择之后的排序。我该如何解决?

提前谢谢!

2 个答案:

答案 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