Sql LINQ:计算多列中的真布尔数
我正在使用LINQtoSQL来加速项目的交付,这对我很有帮助。然而,我正在努力解决一些我习惯于使用手动SQL的事情 我有一个LINQ集合,包含三列,每列包含一个布尔值,表示电子邮件、手机或地址是否可用 我想编写一个LINQ查询,为每列提供一个trues计数,那么电子邮件列中有多少行被设置为true(其他两列也是如此) 其他计数也是如此。您可以这样做:Sql LINQ:计算多列中的真布尔数,sql,linq,linq-to-sql,count,Sql,Linq,Linq To Sql,Count,我正在使用LINQtoSQL来加速项目的交付,这对我很有帮助。然而,我正在努力解决一些我习惯于使用手动SQL的事情 我有一个LINQ集合,包含三列,每列包含一个布尔值,表示电子邮件、手机或地址是否可用 我想编写一个LINQ查询,为每列提供一个trues计数,那么电子邮件列中有多少行被设置为true(其他两列也是如此) 其他计数也是如此。您可以这样做: var emailCount = yourDataContext.YourTable.Count(r => r.HasEmail); 等等
var emailCount = yourDataContext.YourTable.Count(r => r.HasEmail);
等等。如果需要包含结果的单个对象:
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聚合。两点——1)我不相信您可以修改聚合函数的第一个参数,它是只读的。2) 您将0
和1
颠倒,在false上加1,在true上加0。除此之外,这是一个非常好的主意,但是必须对每个元素执行新操作对我来说似乎“不理想”。如何获得列名(组):Count
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;
}
);