我正在撰寫一個C# .NET 5應用程式,它將作為Angular前端的后端,提供CRUD APIs。該應用程式的目的是管理一個飛行學校。
我正在撰寫將回傳飛行員串列和單個飛行員的API方法,即https://myapp/api/pilots和https://myapp/api/pilots/{id}。
我這里有三個方法:
GetPilots()獲取完整的串列 。
GetPilot(long idPilot)獲取詳細資訊 。
- 一個輔助方法
GetFlightTime(long idPilot)回傳每個飛行員的總飛行時間,即飛行時間之和。
我的問題:詳細的方法可以作業,因為我首先呼叫輔助函式,然后我在回傳的視圖模型中使用結果。但是 這是否是因為我在LINQ運算式中呼叫了 謝謝! uj5u.com熱心網友回復: 解決這個問題的一個好方法是確保你的 你的代碼將看起來像這樣: 你的代碼將看起來像這樣:
標籤:GetPilots()不作業,并回傳錯誤System.InvalidOperationException。客戶端投影通過實體方法'GetFlightTime'包含了對'QTBWeb.Models.PilotsRepository'的常量表達的參考。這有可能導致記憶體泄漏;考慮使該方法成為靜態的,以便它不會在實體中捕獲常量。
GetFlightTime方法?我不理解使方法成為靜態的建議。我怎樣才能重新編排代碼以使其發揮作用呢?
publicIEnumerable< PilotViewModel> GetPilots() // THIS METHOD RETURNS ERROR>
{
return _context.Pilots
.Select(pilot => new PilotViewModel
{
Id = pilot.Id,
姓名 = pilot.Name,
FlightMinutes = GetFlightTime(pilot.Id) //問題出在這里。
})
.ToList()。
}
public PilotViewModel GetPilot(long idPilot) // THIS METHOD WORKS>
{
var _flightMinutes = GetFlightTime(idPilot)。
return _context.Pilots
.Select(pilot => new PilotViewModel
{
Id = pilot.Id,
姓名 = pilot.Name,
FlightMinutes = _flightMinutes
})
.Where(pilot => pilot.Id == idPilot)
.FirstOrDefault()。
}
public int GetFlightTime(long idPilot)
{
return _context.Flights
.Where(flight => flight.pilot == idPilot)
.Select(flight => flight.Duration).Sum()。
}
Pilot類有一個Flights的集合,作為你作為Flight.Pilot的一對多映射的另一面。
然后你可以使用這個集合來計算總和,而不必為每個回圈的Pilot實體查詢資料庫。
public IEnumerable< PilotViewModel> GetPilots()。
{
return _context.Pilots
.Include( pilot => pilot.Flights) // Include Flights to join data
.Select(pilot => new PilotViewModel
{
Id = pilot.Id,
Name = pilot.Name,
FlightMinutes = pilot.Flights.Sum(flight => flight.Duration)
});
}
public PilotViewModel GetPilot(long idPilot)
{
return _context.Pilots
.Include(pilot => pilot.Flights) //Include Flights to join data
.Where(pilot => pilot.Id == idPilot) //注意我們先過濾。
.Select( pilot => new PilotViewModel
{
Id = pilot.Id,
Name = pilot.Name,
FlightMinutes = pilot.Flights.Sum(flight => flight.Duration)
})
.FirstOrDefault()。
}
