如何计算满足和不符合标准的记录数量

时间:2012-04-20 12:35:04

标签: .net sql linq-to-sql

我想计算拥有所有者的团队数量(OwnerId!= 0)和不具备的数量(OwnerId == 0)。

在纯SQL中,我只使用2个子查询使用单个查询:

select
    (SELECT COUNT(*) FROM teams WHERE User=0) AS FreeTeams,
    (SELECT COUNT(*) FROM teams WHERE User!=0) AS UsedTeams

他们的方式更简单吗?如何将其翻译成Linq2Sql?

谢谢。

3 个答案:

答案 0 :(得分:5)

var sums =
 (from t in teams
 group t by 0 into g
 select new { freeTeams = g.Count(p => p.User == 0), usedTeams = g.Count(p => p.User != 0) }).SingleOrDefault();

这将只发出一个查询,但它需要两次表扫描,因为L2S无法有效地转换它。

我们可以将其归结为一次表扫描:

var sums =
 (from t in teams
 group t by (t.User != 0) into g
 select new { isUsedTeam = g.Key, Count = g.Count() }).ToList();

这将为您提供两行,一行用于freeTeams,另一行用于usedTeams。 令人讨厌,但是LINQ2SQL提供的最快方式。

答案 1 :(得分:2)

您可以在Linq to SQL中执行此操作,假设您的teams对象已正确设置:

var freeTeams = teams.Count(p => p.User == 0);
var usedTeams = teams.Count(p => p.User != 0);

如果你真的想要一次点击数据库,并且愿意牺牲一些可读性,你可以使用这样的东西:

var counts = from a in teams
    group a by true into aa
    select new
    {
        freeTeams = aa.Count(p => p.User == 0),
        usedTeams = aa.Count(p => p.User != 0)
    };

答案 2 :(得分:2)

在普通SQL中,更简单的方法就是使用CASE语句:

SELECT SUM(CASE WHEN [User]=0 THEN 1 ELSE 0 END) AS FreeTeams,
       SUM(CASE WHEN [User]<>0 THEN 1 ELSE 0 END) AS UsedTeams
FROM Teams