簡體   English   中英

EntityFramework Core Group By 和 Sum

[英]EntityFramework Core Group By with Sum

有一段時間沒有寫任何代碼了,我正試圖通過為我的孩子編寫一個小應用程序來跟蹤他們在夏天讀過的書來擺脫 rust。 DB很簡單,只有3個表。 1 表示書籍(標題、作者、頁面等),1 表示讀者姓名,1 是實際閱讀日志(他們閱讀的每本書 1 行,外鍵與書表和讀者表的關系)。

嘗試使用 EntityFramework 核心編寫一個查詢,該查詢將返回閱讀器讀取的總頁數。 我可以在 SSMS 中運行它並且效果很好

select r.Name, sum(b.Pages) as PagesRead
from ReadingLog rl
inner join Readers r on rl.ReaderId = r.Id
inner join Books b on rl.BookId = b.Id
where rl.IsActive = 1
group by r.Name

我試着在 EF 中這樣寫:

var pagesByReader = _context.ReadingLog
                            .Where(m => m.IsActive)
                            .GroupBy(m => m.Reader.Name)
                            .Select(m => new GraphViewModel()
                                   {
                                      Reader = m.Key,
                                      PagesRead = m.Sum(b => b.Book.Pages)
                                   })
                            .ToList();

但我在運行時收到此錯誤:).Book.Pages' 無法翻譯。 以可翻譯的形式重寫查詢,或通過插入對 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的調用顯式切換到客戶端評估

我想我只是寫錯了 EF 查詢,但我不知道為什么。 任何幫助表示贊賞

看起來您在m.Key中有select 使用GroupBy時,select 中未在 group by 中定義的所有值必須在聚合 function 中。

嘗試將m.Key更改為m.Key.First()

正如評論中提到的,sql 被翻譯成 Linq,就像下面的代碼:

var result = (from rl in _context.ReadingLog 
            join r in _context.Readers on rl.ReaderId equals r.Id 
            join b in _context.Books on rl.BookId equals b.Id 
            where rl.IsActive 
            group new {r,b} by r.Name int g 
            select 
            new GraphViewModel 
            { 
                Reader = g.Key, 
                PagesRead = g.Sum(x => x.b.Pages) 
            }).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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