【发布时间】:2020-06-18 20:39:25
【问题描述】:
我正在尝试使用 Linq 查询数据库,以仅从 SmsMessages 表中获取患者从每个患者发送的最后一条消息。我正在尝试按患者 ID 对消息进行分组,按日期对分组进行排序,然后返回该组的第一条记录,如下所示:
var sms = await _dataContext.SmsMessages
.GroupBy(message => message.PatientId)
.Select(group => group.OrderByDescending(message => message.CreatedOn).FirstOrDefault())
.ToListAsync();
类似问题的几个答案,for example,建议对上述内容进行变体,但在执行查询时收到以下错误: 错误:
失败:Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware1 执行请求时发生未处理的异常。 System.InvalidOperationException: LINQ 表达式'(GroupByShaperExpression: KeySelector: (s.PatientId), 元素选择器:(实体形状表达式: 实体类型:SmsMessage 值缓冲区表达式: (ProjectionBindingExpression:EmptyProjectionMember) IsNullable: 假 ) ) .OrderByDescending(message => message.CreatedOn)' 无法翻译。要么以可翻译的形式重写查询,要么切换到客户评估。
【问题讨论】:
-
分组前按日期降序排列。分组不会改变顺序。所以 then .Select(group => group.First()) 会得到每个病人的最后一条消息。
-
你用的是什么EF? EF 6/EF Core 2.0/EF Core 2.1/EF Core 3.0/EF Core 3.1?
-
我使用的是 EF 核心 3.1
标签: c# entity-framework linq asp.net-core