最近我在一個沒有任何FK的EF Core專案中添加了Navigation Properties,以便在盡可能多的查詢中使用Include而不是Join。但我發現,要么sintax在幾乎所有的查詢中都不適合我的需要(需要分成多個查詢),要么我錯過了什么,所以我舉個例子,我想知道,使用Navigation Properties 你如何獲得一個特定dayType的所有站點及其線路串列? :
| 停止 | stopId |
|---|
| 點 | stopId? |
|---|
| 路線 |
|---|
| serviceDetailId | serviceDetailId |
| 服務詳情 | serviceDetailId | serviceHeaderId |
|---|
| serviceHeaderId |
| 服務頭日 | serviceHeaderDayId | serviceHeaderId |
|---|
| serviceHeaderDayId |
| serviceHeaderDayId |
| 服務頭 | serviceHeaderId |
|---|
| 線 | lineId |
|---|
目前使用Join的作業查詢,我想用Include來翻譯:
var query = (awaittext.stop
.Join(
context.Point,
(stop) => stop.stopId,
(point) => point.stopId。
(stop, point) => new { stop = stop, Point = point })
.Join(
context.Route,
(join) => join.Point.routeId,
(route) => route.routeId。
(join, route) => new { Stop = join.Stop, Route = route })
.Join(
context.ServiceDetail,
(join) => join.Route.routeId,
(serviceDetail) => serviceDetail.routeId。
(join, serviceDetail) => new { stop = join.Stop, ServiceDetail = serviceDetail })
.Join(
context.ServiceHeader,
(join) => join.ServiceDetail.serviceHeaderId,
(serviceHeader) => serviceHeader.serviceHeaderId。
(join, serviceHeader) => new { Stop = join.Stop, ServiceHeader = serviceHeader })
.Join(
context.ServiceHeaderDay,
(join) => join.ServiceHeader.serviceHeaderId。
(serviceHeaderDay) => serviceHeaderDay.serviceHeaderId。
(join, serviceHeaderDay) => new { Stop = join.Stop, ServiceHeader = join.ServiceHeader, ServiceHeaderDay = serviceHeaderDay })
.Join(
context.Line,
(join) => join.ServiceHeader.lineId。
(line) => line.lineId。
(join, line) => new { Stop = join.Stop, ServiceHeaderDay = join.ServiceHeaderDay, Line = line })
.Where(e => e.ServiceHeaderDay.DayType == "L"/span>)
.Select(e => new { Stop = e.Stop, Line = e.Line })
.Distinct()。
.ToListAsync())
//查詢到此結束,接下來的步驟是只是將by Stops和插入每個Line串列到其中。
.GroupBy(e => e.Stop.stopId)
.Select(e =>
{
var stop = e.First().Stop;
stop.Lines = e.Select(e => e.Line).ToList()。
return stop;
})
使用Include進行的失敗嘗試之一:
context.Stop。
.Include(e => e.Points)
.ThenInclude(e => e.Route)
.ThenInclude(e => e.ServiceDetail)
.ThenInclude(e => e.ServiceHeader)
.ThenInclude(e => e.ServiceHeaderDay)
Where(e => e.DayType ="L")
//現在我需要從ServiceHeader中包含Line,但這是一個ServiceHeaderDay的型別。
//我認為你不能使用匿名物件來承載所有你剛剛包含的表格。
//所以我發現人們像這樣重復包括:
.Include(e => e.Point)
.ThenInclude(e => e.Route)
.ThenInclude(e => e.ServiceDetail)
.ThenInclude(e => e.ServiceHeader)
.ThenInclude(e => e.Line)
//這似乎不起作用,但如何選擇以獲得所有的停止點?
// 這里的每一站的線條?
.Select(e => ?)
uj5u.com熱心網友回復:
如果我正確理解你的問題,你的查詢可以簡化很多。Include通常不是用來查詢的,而是用來加載相關資料進行修改的。
var query = context.stop
.Where(s => s.Points.Any(p => p.Route.ServiceDetail.ServiceHeader.ServiceHeaderDay.DayType = 'L')
.Select(s => new)
{
Stop = s,
行 = s.Points.Where(p => p.Route.ServiceDetail.ServiceHeader.ServiceHeaderDay.DayType = 'L'/span>)
.Select(p => p.Route.ServiceDetail.ServiceHeader.Line)
.ToList()
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310053.html
標籤:
上一篇:LINQ中的內部連接
