我正在尝试从一个表中获取多个计数统计信息,但是我没有得到想要的结果。
代码
var result = _db.Users.Select(g => new
{
count = _db.Users.Count(),
acCount = _db.Users.Count(u => u.User.State == AccountState.AwaitingConfirmation)
});
SQL请求
SELECT (
SELECT COUNT(*)
FROM `users` AS `c`
) AS `count`, (
SELECT COUNT(*)
FROM `users` AS `u`
INNER JOIN `users` AS `u.User` ON `u`.`UserId` = `u.User`.`Id`
WHERE `u.User`.`State` = 4
) AS `acCount`
FROM `users` AS `g`
预期结果
result = { count = ?, acCount = ? }
实际结果(表中有4个用户)
result = [
{ count = ?, acCount = ? },
{ count = ?, acCount = ? },
{ count = ?, acCount = ? },
{ count = ?, acCount = ? }
]
显然这是错误的,因为我使用的是Select
,它给了我N次计数(N是users表中的行数)。
我想要的是能够直接一次获得这些计数,最好是在一个请求中。
我也尝试了GroupBy(i => 1)
,但这给出了很多sql请求。
谢谢。
答案 0 :(得分:2)
由于_db.Users.Select
语句,正在为用户的每一行执行查询。
您可以使用以下查询仅从表中获取计数:
var counts = new {
count = _db.Users.Count(),
acCount = _db.Users.Count(u => u.User.State == AccountState.AwaitingConfirmation)
};
要在单个查询中获得两个计数-如注释中所述(注意,使用标志标识待确认的确认并按常量分组,然后使用sum来基于标志获取计数):
var counts =
_db.Users
.Select(e => new { AwaitingConfirmation =
u.User.State == AccountState.AwaitingConfirmation ? 1 : 0 })
.GroupBy(e => 1)
.Select(g => new
{
Count = g.Count(),
account = g.Sum(e => e.AwaitingConfirmation)
}).FirstOrDefault();