2010-03-11 49 views
3

我正在使用LINQ to SQL来加快项目的交付速度,它真的帮助了。然而,我正在努力处理一些我习惯用手动SQL做的事情。LINQ:计算多列中真布尔值的数量

我有一个LINQ集合包含三列,每列包含表示电子邮件,手机或地址是否可用的布尔值

我想写LINQ查询给我trues的计数每列,所以在电子邮件列有多少行被设置为true(与同为另两列)

回答

2

如果您需要一个包含结果的单个对象:

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; 
} 
); 

xResult的类型,包含汇总信息。这也可以用于更多的compelx聚合。

+0

两点 - 1)我不相信你可以修改聚合函数的第一个参数,它是只读的。 2)你的'0'和'1'颠倒了,你在false上加1,在true上加0。除此之外,一个非常好的想法,但不得不对每个元素做一个“新”,对我来说似乎“不理想”。 – Hogan 2012-07-19 20:46:56

1
var mobileCount = myTable.Count(user => user.MobileAvailable); 

等等等等。

1

你能做到像这样:

var emailCount = yourDataContext.YourTable.Count(r => r.HasEmail);