Linq-to-SQL: как выполнить подсчет для подвыбора - PullRequest
0 голосов
/ 16 марта 2010

Я все еще пытаюсь понять, как правильно использовать LINQ-to-SQL, а не просто писать свои собственные sprocs.

В коде, который принадлежит userId, передается в метод, затем LINQ использует его для получения всех строк из таблиц GroupTable , соответствующих userId . Первичный ключ таблицы GroupUser - GroupUserId , который является внешним ключом в таблице Group .

    /// <summary>
    /// Return summary details about the groups a user belongs to
    /// </summary>
    /// <param name="userId"></param>
    /// <returns></returns>
    public List<Group> GroupsForUser(int userId)
    {
        DataAccess.KINv2DataContext db = new DataAccess.KINv2DataContext();
        List<Group> groups = new List<Group>();

        groups = (from g in db.Groups
                  join gu in db.GroupUsers on g.GroupId equals gu.GroupId
                  where g.Active == true && gu.UserId == userId
                  select new Group
                  {
                      Name = g.Name,
                      CreatedOn = g.CreatedOn
                  }).ToList<Group>();


        return groups;
    }
}

Это работает нормально, но я также хотел бы вернуть общее количество пользователей, которые входят в группу, а также общее количество контактов, которые находятся в собственности группы.

Псевдокод, ахой!

    /// <summary>
    /// Return summary details about the groups a user belongs to
    /// </summary>
    /// <param name="userId"></param>
    /// <returns></returns>
    public List<Group> GroupsForUser(int userId)
    {
        DataAccess.KINv2DataContext db = new DataAccess.KINv2DataContext();
        List<Group> groups = new List<Group>();

        groups = (from g in db.Groups
                  join gu in db.GroupUsers on g.GroupId equals gu.GroupId
                  where g.Active == true && gu.UserId == userId
                  select new Group
                  {
                      Name = g.Name,
                      CreatedOn = g.CreatedOn,
                      // ### This is the SQL I would write to get the data I want ###
                      MemberCount = ( SELECT COUNT(*) FROM GroupUser AS GU WHERE GU.GroupId = g.GroupId ),
                      ContactCount = ( SELECT COUNT(*) FROM Contact AS C WHERE C.OwnerGroupId = g.GroupId )
                     // ### End of extra code ###
                  }).ToList<Group>();


        return groups;
    }
}

1 Ответ

4 голосов
/ 16 марта 2010

Кажется, что LINQ-версия того, что я написал на SQL, помогает, я не думал, что это сработает!

    /// <summary>
    /// Return summary details about the groups a user belongs to
    /// </summary>
    /// <param name="userId"></param>
    /// <returns></returns>
    public static List<Group> GroupsForUser(int userId)
    {
        DataAccess.KINv2DataContext db = new DataAccess.KINv2DataContext();
        List<Group> groups = new List<Group>();

        groups = (from g in db.Groups
                  join gu in db.GroupUsers on g.GroupId equals gu.GroupId
                  where g.Active == true && gu.UserId == userId
                  select new Group
                  {
                      GroupId = g.GroupId,
                      Name = g.Name,
                      CreatedOn = g.CreatedOn,
                      ContactCount = (from c in db.Contacts where c.OwnerGroupId == g.GroupId select c).Count(),
                      MemberCount = (from guu in db.GroupUsers where guu.GroupId == g.GroupId 
                                     join u in db.Users on guu.UserId equals u.UserId
                                     where u.Active == true 
                                     select gu ).Count()
                  }).ToList<Group>();

        return groups;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...