繁体   English   中英

无法翻译 LINQ 表达式 - 实体框架核心

[英]The LINQ expression could not be translated - 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 表达式。 我的假设是这是由于外部 select 之后的排序。 我该如何解决?

先感谢您!

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

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

异常消息类似于:

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

不幸的是,目前 EF core 3 的异常太常见了。

子查询中的ToList()添加是这里的罪魁祸首。 删除它,并使用Count()而不是Count再次编译它可能会*使异常 go 消失:

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 的 class model。

class DepartmentEmployees类型是什么?

OrderByICollection类型的成员一起使用时,可能会发生此错误。

请改用List

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM