古老的"group by"选项很好地处理了多个group by字段。问题:如果我想在结果集中包含不属于group by (grp)对象的字段(这些字段不需要分组),该怎么办?从无数的例子来看,它似乎没有处理好这种情况。
在下面的示例中,使用grp对象很好地将所有group by字段包含在结果集中。好,假设"addresses"有一个"street"或"phone",我只是想把它们不分组地包含在结果中。选择吗?
var qry = from addr in addresses
group addr by new { addr.city, addr.state, addr.country } into grp
select new
{
city = grp.Key.city,
state = grp.Key.state,
country = grp.Key.country,
count = grp.Count(),
};
不在分组键中的元素可以从组本身中选择:
var qry = from addr in addresses
group addr by new { addr.city, addr.state, addr.country } into grp
select new
{
city = grp.Key.city,
state = grp.Key.state,
country = grp.Key.country,
count = grp.Count(),
phone = grp.Select(a => a.Phone).FirstOrDefault()
};
你必须考虑使用哪个"聚合"(例如,First, Last, Min, Max, FirstOrDefault,…),这取决于你要使用的逻辑和你正在使用的查询提供程序。例如,EF支持FirstOrDefault,但不支持First
您可能不需要按它们分组,但是任何与分组有1:1关系的内容都有效地分组了。所以只要按电话分组,你会得到相同的结果。
var qry = from addr in addresses
group addr by new { addr.city, addr.state, addr.country, addr.Phone } into grp
select new
{
city = grp.Key.city,
state = grp.Key.state,
country = grp.Key.country,
count = grp.Count(),
phone = grp.Key.Phone
};