如何通过 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=&gt;v.MemberId).ToList() 部分无法转换为数据库查询,这就是为什么建议的修复是使用 AsEnumerable / ToList (或使用他们的异步对应)并在客户端对内存中的集合执行操作。 因此可能会进行快速而肮脏的修复:.Select(s =&gt; new RoomName = s.Key.subjectName, MembersCount = s.Count(), Members = s),然后针对v 执行新的Select,例如v.Select(s =&gt; new s.RoomName, s.MemberCount, MemberIds = s.Members.Select(v=&gt;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 获取分组内信息

3-实体数据模型与LINQ-分组

Linq Group by 并获取返回所有列的特定字符串规则的所有值

如何通过 join 和 group by 在 C# Linq 中获取 Min?

通过 LINQ 进行多连接和分组

LINQ Group By 和选择集合