LINQ按多个字段分组-语法帮助
LINQ按多个字段分组-语法帮助
示例1:
var query = from cm in cust group cm by new { cm.Customer, cm.OrderDate } into cms select new { Key1 = cms.Key.Customer, Key2 = cms.Key.OrderDate, Count = cms.Count() };
示例2(错误):
var qry = cust.GroupBy(p => new { p.Customer, p.OrderDate }, (k, group) => new { Key1 = k.Customer, Key2 = k.OrderDate, Count = group.Count() });
问题出现的原因:用户想要在LINQ查询中使用多个字段进行分组,但是不知道正确的语法。
解决方法:在点符号表示法中使用与查询表达式中相同的匿名类型。
LINQ查询代码示例:
var qry = cust.GroupBy(cm => new { cm.Customer, cm.OrderDate }, (key, group) => new { Key1 = key.Customer, Key2 = key.OrderDate, Count = group.Count() });
在实际的IDE中,我会将`(key, group)`与`cm`参数对齐,但在这里会被换行。
对于使用扩展方法总是犯错的问题,Jon建议查看C#编译器对查询表达式的转换,阅读文档并查看可用的重载方法也会有帮助。
Skeet表示MSDN对于这个重载方法的描述并不多。他认为这个重载方法`groupBy(x=>x.y, (key,group)=>[lambda with group and key])`只是一种更简洁的表达方式,等价于`GroupBy(x=>x.y).select(group=>[lambda with group and group.key])`,而且第二种方式更易读。
另外,用户还提到使用LINQPad也可以学到一些东西,因为在使用LINQ“from foo in bar select foo”语法后,可以在lambda和SQL之间切换。