2015-12-23 4 views
1

У меня есть один favoriteTalent ТаблицаGroupBy в Entity Framework

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 

Я хочу GroupBy Фаворит-ID, значит, я должен узнать, сколько talentids в конкретных 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); 
+0

Вы хотите группировать 'FavoriteID', но вместо этого вы группируете« TalentID »и« FavoriteID »? Я что-то упустил или это явно ваша ошибка? –

ответ

0

Вы должны группой коллекции любимец Id, а затем итерации группы для подсчета различных TalentIDs:

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.

UPDATE

Чтобы добавить "пустые" Избранные в списке результатов вы должны перебирать памятку таблицу:

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

Я попробовал. Но результата не ожидается. –

+0

Вы хотите считать уникальные значения TalentID для каждого фильтра FavoriteID пользователем Id (плюс непонятно для меня r.Favorite.CDUserID == 0), правильно? Если да, то вот ваш код, иначе я неправильно понял вашу проблему. –

+0

Я обновляю свой ответ после тестирования своих данных. –

0

Это должно быть что-то вроде этого:

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

Смежные вопросы