如何通过 LINQ 扩展获取 group 的分组值列表
Posted
技术标签:
【中文标题】如何通过 LINQ 扩展获取 group 的分组值列表【英文标题】:How to get list of the grouped value of group by LINQ extension 【发布时间】:2021-10-16 10:48:35 【问题描述】:我有一个非常简单的 LINQ 语句,它使用 Groupby
扩展名,如下所示
var v = _context.Rooms
.GroupBy(g => new g.postSubjectId, g.postSubject.subjectName )
.Select(s => new RoomName = s.Key.subjectName, MembersCount = s.Count() )
.ToList();
而且没有问题。
但是,当我尝试获取分组列表时,它会返回错误。
失败的尝试
var v = _context.Rooms
.GroupBy(g => new g.postSubjectId, g.postSubject.subjectName )
.Select(s => new RoomName = s.Key.subjectName, MembersCount = s.Count(), MemberIds = s.Select(v=>v.MemberId).ToList() )
.ToList();
错误
InvalidOperationException:LINQ 表达式
'(GroupByShaperExpression: KeySelector: new postSubjectId = (r.postSubjectId), subjectName = (p.subjectName) , ElementSelector:(EntityShaperExpression: EntityType: Room ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ) ) .Select(v => v.MemberId)'
无法翻译。要么重写查询的形式,可以 被翻译,或通过插入显式切换到客户评估 致电AsEnumerable()
、AsAsyncEnumerable()
、ToList()
或ToListAsync()
。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。
这是我的模型和视图模型
房间
public class Room
public Guid Id get; set;
public Guid? postSubjectId get; set;
[ForeignKey("postSubjectId")]
public PostSubject postSubject get; set;
public string MemberId get; set;
[ForeignKey("MemberId")]
public AppUser Member get; set; // extended Identity
发布主题
public class PostSubject
[Key]
public Guid Id get; set;
public string subjectName get; set;
public virtual List<Room> rooms get; set;
【问题讨论】:
请edit您的问题显示使用分组列表时遇到的错误。 @PriyankPanchal 完成 @MOHAMEDABUELATTA 例外情况是MemberIds = s.Select(v=>v.MemberId).ToList()
部分无法转换为数据库查询,这就是为什么建议的修复是使用 AsEnumerable
/ ToList
(或使用他们的异步对应)并在客户端对内存中的集合执行操作。
因此可能会进行快速而肮脏的修复:.Select(s => new RoomName = s.Key.subjectName, MembersCount = s.Count(), Members = s)
,然后针对v
执行新的Select
,例如v.Select(s => new s.RoomName, s.MemberCount, MemberIds = s.Members.Select(v=>v.MemberId).ToList())
【参考方案1】:
这是 SQL 限制。您无法获取该组的记录。对于这种情况,您必须在返回数据限制之前进行客户端分组:
var v = _context.Rooms
.Select(r => new r.postSubjectId, r.postSubject.subjectName, r.MemberId )
.AsEnumerable()
.GroupBy(g => new g.postSubjectId, g.subjectName )
.Select(s => new RoomName = s.Key.subjectName, MembersCount = s.Count(), MemberIds = s.Select(v => v.MemberId).ToList() )
.ToList();
【讨论】:
以上是关于如何通过 LINQ 扩展获取 group 的分组值列表的主要内容,如果未能解决你的问题,请参考以下文章
Linq Group by 并获取返回所有列的特定字符串规则的所有值