我想计算拥有所有者的团队数量(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?
谢谢。
答案 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