Linq按相同数据分组

时间:2016-03-22 10:56:51

标签: c# linq

我正在尝试制作一个LINQ查询,该查询可以找到同年发布超过1张专辑的艺术家。我的疑问是:

 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张的专辑。一直想弄清楚什么是错的,但找不到问题。

1 个答案:

答案 0 :(得分:1)

  

但出于某种原因,这个查询给了我艺术家的总相册数。

这是因为条件

where albumsByYear.Count() > 1

albumsByYear集合的分组,因此您的标准基本上是要包含拥有相册超过一年的艺术家。

你真正需要的是这样的:

where albumsByYear.Any(grouping => grouping.Count() > 1)