2

我想计算拥有所有者 (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?

谢谢你。

4

3 回答 3

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 可用的最快方法。

于 2012-04-20T12:48:52.667 回答
2

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

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)
    };
于 2012-04-20T12:38:56.260 回答
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
于 2012-04-20T12:41:21.510 回答