Не удалось перевести выражение LINQ - Entity Framework Core - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь найти все отделы с более чем пятью сотрудниками. Вот что я пробовал:

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 голосов
/ 08 августа 2020

Текущий ответ предполагает, что свойство навигации Department.Employees должно иметь тип List. Это неправильно и упускает из виду главное. Дело здесь почти в обратном.

Во-первых, ICollection идеально подходит для свойств навигации. Он используется во многих примерах официальной документации Entity Framework. Кроме того, сортировка по Count (без ()) таких свойств навигации работает нормально. И, конечно же, Count().

Сообщение об исключении было примерно таким:

Запрос [текст запроса] не может быть переведен. Либо перепишите запрос в форме, которая может быть переведена, либо переключитесь на оценку клиента явно, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ().

Исключение, которое, к сожалению, слишком часто встречается в настоящее время для 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.

0 голосов
/ 06 августа 2020

Какой тип Employees в классе Department?

Эта ошибка может возникнуть, когда OrderBy используется с членом типа ICollection.

Используйте List взамен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...