Linq to sql,使用其他计数查询多对多

Linq to sql, query many-to-many with count of other

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

以下是我的查询

    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.

直接执行此操作

您需要一个 Group By 将所有 CourseUsers 合并成一个集合,然后是一个 Join 以将用户附加到它。

from course in _dbContext.CourseUsers // outer sequence
group course by course.UserId into courseGrp
join user in _dbContext.Users //inner sequence 
on courseGrp.Key equals user.UserId// key selector 
select new { // result selector 
  CourseUsersCount = courseGrp.Count(),
  user.Name,
  user.Id
};

如评论中所述,您必须使用 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()
    };