我正在使用LINQ to SQL来加快项目的交付速度,它真的帮助了。然而,我正在努力处理一些我习惯用手动SQL做的事情。LINQ:计算多列中真布尔值的数量
我有一个LINQ集合包含三列,每列包含表示电子邮件,手机或地址是否可用的布尔值。
我想写LINQ查询给我trues的计数每列,所以在电子邮件列有多少行被设置为true(与同为另两列)
我正在使用LINQ to SQL来加快项目的交付速度,它真的帮助了。然而,我正在努力处理一些我习惯用手动SQL做的事情。LINQ:计算多列中真布尔值的数量
我有一个LINQ集合包含三列,每列包含表示电子邮件,手机或地址是否可用的布尔值。
我想写LINQ查询给我trues的计数每列,所以在电子邮件列有多少行被设置为true(与同为另两列)
如果您需要一个包含结果的单个对象:
var result = new {
HasEmailCount = list.Count(x => x.HasEmail),
HasMobileCount = list.Count(x => x.HasMobile),
HasAddressCount = list.Count(x => x.HasAddress)
};
或者使用聚合函数:
class Result
{
public int HasEmail;
public int HasAddress;
public int HasMobile;
}
var x = data.Aggregate(
new Result(),
(res, next) => {
res.HasEmail += (next.HasEmail ? 0 : 1);
res.HasAddress += (next.HasAddress ? 0 : 1);
res.HasMobile += (next.HasMobile ? 0 : 1);
return res;
}
);
x
是Result
的类型,包含汇总信息。这也可以用于更多的compelx聚合。
var mobileCount = myTable.Count(user => user.MobileAvailable);
等等等等。
你能做到像这样:
var emailCount = yourDataContext.YourTable.Count(r => r.HasEmail);
等
两点 - 1)我不相信你可以修改聚合函数的第一个参数,它是只读的。 2)你的'0'和'1'颠倒了,你在false上加1,在true上加0。除此之外,一个非常好的想法,但不得不对每个元素做一个“新”,对我来说似乎“不理想”。 – Hogan 2012-07-19 20:46:56