我正在通过阅读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};
作者的输出是:
我通过使用运算符而不是表达式来重写。我试过这个但是在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})}
);
这是我的输出:
答案 0 :(得分:1)
第一个查询执行单个groupBy,第二个执行两个嵌套的groupBy。
要准确表示方法语法中的第一个查询,您需要overload of GroupBy that takes two parameters,一个用于选择每个元素的键,另一个用于选择组中每个元素的表示
.GroupBy(book => book.Subject, book => new {book.Title, book.Publisher.Name} )
(请注意,您无需创建仅包含一个成员的匿名对象:book => book.Subject
与book => 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
这与前两个命令的组合完全相同。