通过在linq显示中使用运算符的多个组与使用表达式不同

时间:2014-12-02 19:37:43

标签: linq

我正在通过阅读Linq in Action书来学习Linq。在第5章中,作者执行多个分组。 linq表达式如下:

var query =
  from book in SampleData.Books
  group new {book.Title, book.Publisher.Name} by book.Subject into grouping
  select new {Subject=grouping.Key.Name, Books=grouping};

作者的输出是:enter image description here

我通过使用运算符而不是表达式来重写。我试过这个但是在LinqPad中显示的结果与上面的不一样:

var query2 = SampleData.Books.GroupBy(
                book => new {book.Subject}
            )
            .Select(book => new {
                    Subject = book.Key.Subject.Name, 
                    Children = book.GroupBy(b => new {b.Subject.Description, b.Subject.Name})}
            );

这是我的输出:enter image description here

1 个答案:

答案 0 :(得分:1)

第一个查询执行单个groupBy,第二个执行两个嵌套的groupBy。

要准确表示方法语法中的第一个查询,您需要overload of GroupBy that takes two parameters,一个用于选择每个元素的键,另一个用于选择组中每个元素的表示

.GroupBy(book => book.Subject, book => new {book.Title, book.Publisher.Name} )

(请注意,您无需创建仅包含一个成员的匿名对象:book => book.Subjectbook => new{book.Subject}

一样有效

然后,您可以对GroupBy运算符的结果执行最终选择:

.Select(grouping => new {Subject=grouping.Key.Name, Books=grouping});

如果您使用这个更加模糊的GroupBy overload that takes three parameters:键选择器,元素选择器和结果选择器,您也可以仅使用GroupBy命令执行此操作:

.GroupBy(book => book.Subject,  
                 // select a key
         book => new {book.Title, book.Publisher.Name},
                 // select the elements of each group
         grouping => new {Subject=grouping.Key.Name, Books=grouping} ) 
                 // select the final result

这与前两个命令的组合完全相同。