Текущий ответ предполагает, что свойство навигации 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.