假設我有一個帶有地點ID和地點名稱的地點表。假設我想獲得每個地點的收入(在這個簡單的場景中,我甚至可能不需要GroupBy - 但請假設我需要!)
var revenues = await _context.SaleTransaction.GroupBy(s => s.LocationId)
.Select(x => new LocationDTO {
LocationId = x.Key,
LocationName = ???
收入 = x.Sum(i => i.Amount)
}).ToListAsync()。
我試圖作弊
LocationName = x.Select(i => i.Location.LocationName).First()
因為這個ID的所有位置名稱都是一樣的。但是EF無法翻譯First(),除非我使用AsEnumerable()并將整個銷售表帶入應用程式記憶體。
或者我可以第二次遍歷結果:
foreach(var revenue in revenue) {
revenue.LocationName = _context.Location.Find(revenue.LocationId).LocationName。
}
鑒于地點的數量是固定的(而且相對較小),這可能是最好的方法。但是,既不為每個位置去DB O(n),也不把整個位置串列拉到記憶體中,這都不太合適。也許有一種方法可以將LocationName(和其他一些屬性)作為GroupBy陳述句的一部分。
我使用的是EF Core 5;或者如果EF Core 6中出現了什么,那也是可以的。
uj5u.com熱心網友回復:
從我所看到的情況來看,你需要一個linq join查詢,以便加入搜索。有了EF linq查詢,就意味著那些東西在被使用之前不會被加載到記憶體中,所以它將解決加載整個表的問題。
你可以這樣寫:
var revenues = await _context.SaleTransactions.Join(_context. Locations, s => s.LocationId, l => l.Id, (s, l) => new {LocationId = s.LocationId, LocationName = l.LocationName, Revenues = s.Sum(i => i.Amount)})。
我將用你可能的模型的模擬來鏈接整個fiddle的內容 https://dotnetfiddle.net/BGJmjj
uj5u.com熱心網友回復:
你可以通過一個以上的值進行分組。 例如;
var revenues = await _context.SaleTransaction
.GroupBy(s => new {
s.LocationId,
s.Location.Name
})
.Select(x => new LocationDTO {
LocationId = x.Key.LocationId,
LocationName = x.Key.Name,
收入 = x.Sum(i => i.Amount)
}).ToListAsync()。
盡管看起來你在計算每個地點的總額,在這種情況下,你可以圍繞地點建立你的查詢。
var revenues = await _context.Location
.Select(x => new LocationDTO {
LocationId = x.Id,
LocationName = x.Name,
收入 = x.SaleTransactions.Sum(i => i.Amount)
}).ToListAsync()。
uj5u.com熱心網友回復:
var revenues = await _context.Location
.Select(x => new LocationDTO {
LocationId = x.Id,
LocationName = x.Name,
收入 = x.SaleTransactions.Sum(i => i.Amount)
}).ToListAsync()。
有一個例子。 .NetFiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309856.html
標籤:
