实体框架中的GroupBy

本文关键字:GroupBy 框架 实体 | 更新日期: 2023-09-27 18:27:53

我有一个favoriteTalent

FavoriteTalentID                         TalentID             FavoriteID
101                                      54760                        1
102                                      54633                        1
103                                      54979                        1
104                                      54939                        9
105                                      54551                        9
106                                      54630                        3
107                                      54992                        3
108                                      54778                        7
109                                      60293                        7
110                                      53336                        4

我想按收藏ID分组,这意味着我必须找出特定的FavoriteID 中有多少人才

FavoriteID一样,1有3个TalentID

这是我编写的查询,但输出并不完美。

我想GroupByFavoriteID。这意味着我必须找出特定的FavoriteID 中有多少TalentIDs

var q = db.FavoriteTalents.Where(r => r.Favorite.CDUserID == UserID    
        ||r.Favorite.CDUserID == 0).GroupBy(t =>
new { t.TalentID, t.FavoriteID }
).Select(r => 
new { 
TalentID = r.Key.TalentID,
count = r.Count(),
CDUserID = r.FirstOrDefault().Favorite.CDUserID,
Title = r.FirstOrDefault().Favorite.Title}).ToArray();
return JsonResult(q);

实体框架中的GroupBy

您应该按收藏Id对收藏进行分组,然后迭代组以计数不同的TalentID:

var q = db.FavoriteTalents
            .Where(r => r.Favorite.CDUserID == UserID || r.Favorite.CDUserID == 0)
            .GroupBy(t => t.FavoriteID)
            .Select(r => new { FavoriteID = r.Key, Count = r.Select(grouped => grouped.TalentID).Distinct().Count() })
            .ToArray();

GroupBy返回具有选择器从方法参数中选择的键的IGrouping的集合,以及具有选择器函数的相同结果的源对象的集合。

这里有相同的答案。

更新

要将"空"Favorits添加到结果列表中,您应该迭代Favorits表:

var q = db.Favorites
            .Where(f => f.CDUserID == UserID || f.CDUserID == 0)
            .GroupBy(f => f.FavoriteID, f => f.FavoriteTalents)
            .Select(r => new { FavoriteID = r.Key, Count = r.SelectMany(grouped => grouped).Select(ft => ft.TalentID).Distinct().Count() })
            .ToArray();

应该是这样的:

foreach (string str in db.FavoriteTalents.GroupBy(c => c.FavoriteID)
                       .Select(group => new
                       {
                          fID = @group.Key,
                          Count = @group.Count()
                       }).OrderBy(x => x.fID).Select(item => String.Format("{0} ---> {1}", item.fID, item.Count)))
                     //Or even better with string interpolation : item => $"{item.fID} ---> {item.Count}"
{
     MessageBox.Show(str);
}

结果是:

1-->3

9-->2

3-->2

7->2

4->1