.NET 6中Linq GroupBy查询抛出异常如何重构?
解决方案
错误原因
.NET 6使用的EF Core 6对LINQ查询的翻译逻辑与.NET Framework中的旧版Entity Framework不同,原查询中直接对分组后的IGrouping对象按grp.Key.Name排序的写法无法被EF Core正确转换为SQL语句。
重构方案(两种可选)
方案一:投影分组结果后排序
通过先投影包含分组Key和元素的结构,再执行排序,让EF Core能正确翻译排序逻辑到数据库端:
var query = from x in dbContext.table1 join y in dbContext.table2 on x.AccountId equals y.AccountId join v in dbContext.v on x.RecId equals v.RecId group new { x, y.Name, y.Email, v.SecretKey } by new { x.CreatedDate, y.Name } into grp select new { GroupKey = grp.Key, GroupItems = grp.Select(item => new { item.x, item.Name, item.Email, item.SecretKey }) } into groupedResult orderby groupedResult.GroupKey.Name select groupedResult;
方案二:使用方法链语法重构
改用方法链的写法明确分组与排序逻辑,EF Core 6通常能正确识别这种写法并翻译为SQL:
var query = dbContext.table1 .Join(dbContext.table2, x => x.AccountId, y => y.AccountId, (x, y) => new { x, y }) .Join(dbContext.v, xy => xy.x.RecId, v => v.RecId, (xy, v) => new { xy.x, xy.y, v }) .GroupBy( groupingKey => new { groupingKey.x.CreatedDate, groupingKey.y.Name }, groupItem => new { groupItem.x, groupItem.y.Name, groupItem.y.Email, groupItem.v.SecretKey } ) .OrderBy(grp => grp.Key.Name);
说明
两种方案均会将排序逻辑推送到数据库端执行,避免将百万级数据拉取到客户端处理,符合生产环境性能要求。如果业务不需要保留IGrouping对象结构,优先选择方案一,其投影的明确结构更利于EF Core稳定翻译;若需保留分组对象的原生结构,方案二更适用。
内容的提问来源于stack exchange,提问作者Sarvesh Patil
相关产品推荐
相关产品推荐

