Группируйте по столбцу и получите первую запись группы с помощью Linq - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь запросить базу данных с помощью Linq, чтобы получить только последнее сообщение, которое пациент отправил от каждого пациента из таблицы SmsMessages. Я пытаюсь сгруппировать сообщения по идентификатору пациента, отсортировать группы по дате, а затем вернуть первую запись этой группы, например:

   var sms = await _dataContext.SmsMessages
                .GroupBy(message => message.PatientId)
                .Select(group => group.OrderByDescending(message => message.CreatedOn).FirstOrDefault())
                .ToListAsync();

Несколько ответов на похожие вопросы, для пример , предлагаю выполнить вариант выше, но при выполнении запроса я получаю следующую ошибку: Ошибка:

сбой: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware 1 Произошло необработанное исключение при выполнении запроса. System.InvalidOperationException: выражение LINQ '(GroupByShaperExpression: KeySelector: (s.PatientId), ElementSelector: (EntityShaperExpression: EntityType: SmsMessage ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) сообщение) IsNullable>. не может быть переведено. Либо перепишите запрос в форме, которая может быть переведена, либо переключитесь на оценку клиента.

1 Ответ

0 голосов
/ 19 июня 2020

Эта проблема связана с Оценка клиента и сервера .

Перед выполнением GroupBy необходимо добавить операцию ToList() в _dataContext.SmsMessages, чтобы преобразовать серверную операцию в клиентскую.

В противном случае на стороне сервера sql сервер не может распознавать методы на стороне клиента .

Просто измените свой код следующим образом:

 var sms = await _dataContext.SmsMessages.ToList()
                .GroupBy(message => message.PatientId)
                .Select(group => group.OrderByDescending(message => message.CreatedOn).FirstOrDefault())
                .ToListAsync();
...