2016-03-22 3 views
0

Я пытаюсь сделать запрос LINQ, который найдет художников с более чем 1 альбомом, выпущенным в том же году. Мой запрос:Linq grouping по тем же данным

from ar in artists 
join al in albums on ar.ArtistID equals al.ArtistID into allAlbumsByArtist 
let albumsByYear = allAlbumsByArtist.GroupBy(a => a.YearPublished) 
where albumsByYear.Count() > 1 
select ar; 

По какой-то причине этот запрос дает мне художников по общему количеству альбомов. Я попытался рассекает его шаг за шагом:

var artistsAndAlbums = 
    from ar in artists 
    join al in albums on ar.ArtistID equals al.ArtistID into allAlbumsByArtist 
    select new { Artist = ar, AllAlbums = allAlbumsByArtist }; 

, а затем

foreach (var item in artistsAndAlbums) 
{ 
    Console.WriteLine(item.Artist.Name); 
    var albumsByYear = item.AllAlbums.GroupBy(a => a.YearPublished); 
    foreach (var al in albumsByYear) 
     Console.WriteLine(al.Count() > 1); 
} 

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

+4

«Не работает» и «не получает мне правильный результат» не дает нам никакой информации о том, что на самом деле не так. Укажите исходные данные, ожидаемый результат и фактический результат. –

+0

@JonSkeet исправно. – daremkd

+1

Ну, я не вижу входных данных, ожидаемых выходных данных и фактических выходных данных ... –

ответ

1

Но по какой-то причине этот запрос дает мне художников по общему количеству альбомов.

Это из-за состояния

where albumsByYear.Count() > 1 

albumsByYear является коллекция группировок, так что ваши критерии в основном говорят, чтобы включать в себя художников, у которых есть альбомы для более чем одного года.

Что вам действительно нужно, как это:

where albumsByYear.Any(grouping => grouping.Count() > 1) 
Смежные вопросы