Выражение LINQ не может быть переведено. Либо перепишите запрос в форме, которая может быть переведена - PullRequest
0 голосов
/ 26 марта 2020

Из таблицы SQL я пытаюсь получить последнюю строку каждого элемента. Я передаю список пользователей (список objectIds) и хочу получить последнее задание каждого из них. Ниже приведена функция.

   public async Task<List<Job>> GetLastJobs(List<int> objectIds)
    {
        using ManagerContext context = new ManagerContext(_callContext);
        List<Job> jobs = context.Jobs.Where(j => j.ObjectId.HasValue && objectIds.Contains(j.ObjectId.Value)).GroupBy(j => j.ObjectId).Select(j => j.OrderByDescending(p => p.Id).FirstOrDefault()).ToList();
        return null;
    }

Во время исключения она возвращает:

the LINQ expression '(GroupByShaperExpression:
KeySelector: (j.ObjectId),
ElementSelector:(EntityShaperExpression: 
    EntityType: Job
    ValueBufferExpression: 
        (ProjectionBindingExpression: EmptyProjectionMember)
    IsNullable: False
)
)
    .OrderByDescending(p => p.Id)' could not be translated. 

Либо переписать запрос в форме, которая может быть переведена, либо явным образом переключиться на оценку клиента с помощью вставка вызова в AsEnumerable (), AsAsyncEnumerable (), ToList () или ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

Я понятия не имею, как, с чего начать, чтобы решить проблему

1 Ответ

1 голос
/ 26 марта 2020

Основная проблема c заключается в том, что SQL не имеет такого мощного оператора группировки, как GroupBy LINQ. SQL GROUP BY должна агрегировать все не группирующие столбцы, и в большинстве СУБД нет функции агрегирования FIRST (). Таким образом, вы должны написать этот запрос с помощью функций управления окнами, к которым EF Core не дошел.

Альтернативный способ написания этого запроса может быть переведен.

  var jobs = db.Jobs.Where(j => j.ObjectId.HasValue && objectIds.Contains(j.ObjectId.Value))
                    .Where(j => j.Id == db.Jobs.Where(j2 => j2.ObjectId == j.ObjectId).Max(j => j.Id))
                    .ToList();

Что означает

SELECT [j].[Id], [j].[ObjectId]
FROM [Jobs] AS [j]
WHERE ([j].[ObjectId] IS NOT NULL AND [j].[ObjectId] IN (1, 2, 3)) AND ([j].[Id] = (
    SELECT MAX([j0].[Id])
    FROM [Jobs] AS [j0]
    WHERE [j0].[ObjectId] = [j].[ObjectId]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...