[英]Include both COUNT(*) and Sum(X) in a single async query Entity Framework
在我的 ASP.NET MVC 项目中,我试图实现与此 SQL Server 代码等效的代码:
SELECT COUNT(*) as TotalCount, SUM(SomeColumn) as TotalSum
FROM SomeTable
WHERE param1 = 'foo' AND param2 = 'bar'
...在单个异步查询中使用实体框架。 本质上,我不仅希望获得总和,还希望获得用于在一次调用中计算SomeColumn
列总和的行数。
到目前为止,我只在两次调用中做到了这一点:
using (var context = new myEntities())
{
// 1st query which does .SumAsync(x => x.SomeColumn)
// 2nd query which performs a .Count() on the result set
}
是否可以在一个异步调用中执行此操作,如上面提供的 SQL? 我应该在 SQL 端创建一个视图还是存储过程?
var query = await (from zz in db.SomeTable
where zz.Foo > 1
group zz by 1 into grp
select new
{
rowCount = grp.CountAsync(),
rowSum = grp.SumAsync(x => x.SomeColumn)
}).ToListAsync();
我在正在运行的开发环境中测试了同步版本。
实际上没有必要在IQueryable上调用SumAsync。 以下将以您希望的方式为您提供所需的查询:
var foo = from item in context.Items
group item by item.ID into grp
select new
{
Value = grp.Sum(f => f.ID),
Count = grp.Count()
};
await foo.ToListAsync();
使用EF Core 6.0测试
以下LINQ查询:
await Table.GroupBy(_ => 1, (_, rows) => new
{
Count = rows.Count()
Sum = rows.Sum(x => x.Column),
Average = rows.Average(x => x.Column),
})
.FirstOrDefaultAsync();
将转换为以下SQL查询:
SELECT TOP(1)
COUNT(*) AS [Count]
SUM([t].[Column]) AS [Sum],
AVG([t].[Column]) AS [Average],
FROM[Table] AS [t]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.