【问题标题】:GroupBy in Entity Framework实体框架中的 GroupBy
【发布时间】:2015-12-24 01:07:46
【问题描述】:

我有一张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。这意味着我必须找出具体的 TalentIDs 有多少 FavoriteID

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);

【问题讨论】:

  • 您想按FavoriteID 分组,但您却按TalentIDFavoriteID 分组?我是否遗漏了什么,或者这显然是您的错误?

标签: c# entity-framework


【解决方案1】:

您应该按收藏夹 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 集合和具有相同选择器函数结果的源对象集合。

有同样的答案here

更新

要将“空”收藏夹添加到结果列表中,您应该迭代收藏夹表:

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();

【讨论】:

  • 您想按用户 ID 计算每个 FavoriteID 过滤器的 TalentID 唯一值(加上对我来说难以理解的 r.Favorite.CDUserID == 0),对吧?如果是,那么这是您的代码,否则我误解了您的问题。
  • 它的工作。但我也想要没有任何 TalentID 的 favoriteID。
  • @AjaySingh 对于这种情况,您应该迭代您的“Favorites”表而不是“FavoriteTalents”,因为没有 Talents 的 Favorits 在 FavoriteTalents 表中不会有任何行。
【解决方案2】:

应该是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2012-01-25
    相关资源
    最近更新 更多