簡體   English   中英

在單個異步查詢實體框架中同時包含 COUNT(*) 和 Sum(X)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM