首页 > 解决方案 > Linq to sql,查询多对多与其他计数

问题描述

我有一个多对多的关系,我正在尝试创建一个查询,它将获取我的左侧和一个计算由它引用的记录数的属性。

以下是我的查询

    var dbSet = await (from user in _dbContext.Users
                       where (from courseUsers in _dbContext.CourseUsers select courseUsers.UserId).Contains(user.Id)
                        select new
                        {
                           Name = user.Name,
                           Id = user.Id,
                           CourseUsersCount = _dbContext.CourseUsers.Where(item => item.UserId == user.Id).Count()
                        })
                        .ToListAsync();

我不喜欢 CourseUsersCount 的计算方式。我还想包括总计数属性,我这样做的方式是在其上添加另一个属性,它只select会对 进行计数,_dbContext.CourseUsers 然后再进行另一个内存转换。

最后,我希望创建具有此结构的结果

{
   count: 1000,
   data: [{
      Id: 1,
      Name: "c",
      CourseUsersCount: 2
   }]
}

我想知道如何使用 linq-to-sql 直接执行此操作。

标签: linqlinq-to-sql

解决方案


如评论中所述,您必须使用 GroupBy 进行此类计算:

var query
    from user in _dbContext.Users
    from courseUsers in user.Courses
    group user by new { user.Id, user.Name } into g
    select new 
    {
        g.Key.Id,
        g.Key.Name,
        CourseUsersCount = g.Count()
    };

推荐阅读