我有一個名為 TicketHistory 的表,其中 TicketId 是一個 ForeignKey,并且我存盤了對工單屬性(例如“狀態”、“受讓人”、“優先級”、“更新日期”等)執行的更新操作的記錄作為我的表資料。所以表中有多個具有相同 TicketId 值的行。
我正在嘗試做的是撰寫 Linq 來獲取屬于某些票證的歷史記錄串列,這些票證至少在其狀態更新為“X”時更新過。但正如我所說,可能已對同一張票多次執行相同的更新操作,我只想檢索最新的一張。所以基本上只有一條記錄屬于某個票證(我提供票證 ID),這是票證的狀態上次更新為 X 的記錄。
我正在使用 EntityFrameworkCore 3.1.4,我寫的 Linq 如下:
var histories = await _context.TicketHistories
.Include(i => i.Ticket).ThenInclude(t => t.Status)
.Include(n => n.Ticket).ThenInclude(h => h.Priority)
.Where(w => ticketIds.Any(a => a == w.TicketId) &&
w.Status.TicketStatusCode == "X" &&
w.Active &&
!w.Deleted)
.GroupBy(g => g.TicketId)
.OrderByDescending(o => o.Max(m => m.Created))
.Select(s => s.FirstOrDefault())
.ToListAsync();
好吧,當我運行上面的代碼時,我收到一些錯誤訊息,如標題:“在 Include 中使用的 Lambda 運算式無效。”
你們能幫我糾正我的linq,或者至少給我指路。
uj5u.com熱心網友回復:
已知 EF Core 限制,分組后無法獲取專案。僅Key支持聚合結果。請注意,從 EF Core 6 開始,您的查詢將起作用。
您可以使用以下解決方法,它模仿 EF Core 6 查詢轉換:
var dataQuery = _context.TicketHistories
.Include(i => i.Ticket).ThenInclude(t => t.Status)
.Include(n => n.Ticket)
.Where(w => ticketIds.Contains(w.TicketId) &&
w.Status.TicketStatusCode == "X" &&
w.Active &&
!w.Deleted);
var query =
from key in dataQuery.Select(d => new { d.TicketId }).Distinct()
from d in dataQuery.Where(d => d.TicketId == key.TicketId)
.OrderByDescending(d => d.Created)
.Take(1)
select d;
var histories = await query.ToListAsync();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510643.html
