首页 > 解决方案 > 无法翻译 LINQ 表达式 - 实体框架核心

问题描述

我正在尝试查找员工人数超过五人的所有部门。这是我尝试过的:

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

先感谢您!

标签: c#linqentity-framework-core

解决方案


当前答案表明导航属性Department.Employees应该是 type List。这是不正确的,它没有抓住重点。这里的观点几乎相反。

首先,ICollection非常适合导航属性。它在官方实体框架文档中的许多示例中使用。Count此外,按(不())此类导航属性的排序也可以正常工作。当然Count(),还有。

异常消息类似于:

无法翻译查询 [查询文本]。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。

不幸的是,目前 EF core 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 的类模型。


推荐阅读