在我的ASP.NET MVC项目中,我正在尝试实现此SQL Server代码的同等产品: 选择计数(*)作为总计,总计(SOMECOLUMN) 从某种程度上 其中param1 ='foo'和param2 = ...

问题描述 投票:0回答:3

...带有单个异步查询中的实体框架。本质上,我不仅要获得总和,而且要获取用于计算单个呼叫中

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侧创建视图或存储的Proc吗?

efcore6.0

进行测试

以下
c# asp.net-mvc entity-framework asp.net-mvc-5
3个回答
7
投票
查询:

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]
    

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();

I在我正在运行的开发环境中测试了同步版本。
    

4
投票
以下内容与@rafi Hengs解决方案相同,但在更可读的语法中:
await Table.GroupBy(_ => 1)
           .Select(group => new
           {
               Count = group.Count(),
               Sum = group.Sum(x => x.Column),
               Average = group.Average(x => x.Column)
           })
          .FirstOrDefaultAsync();


1
投票
有很多(方便)的过载,一眼就很难理解。 我已经在使用EF Core v8.0.4和

Npgsql

作为提供商的测试中进行了测试。

确实,实际上并不需要在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();

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.