我通过阅读《动作书》中的Linq来学习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})}
);
这是我的输出:
第一个查询执行单个groupBy,第二个查询执行两个嵌套的groupBy。
为了准确地表示方法语法中的第一个查询,您需要GroupBy的重载,它需要两个参数:一个为每个元素选择键,另一个为选择组中每个元素的表示形式
.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重载,它需要三个参数:键选择器,元素选择器和结果选择器,则也可以仅使用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
这与前两个命令的组合完全相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句