1
我正在嘗試編寫一個查詢,它可以篩選父表中的字段,包括子表以及篩選子表中的字段。如何在一對多關係中篩選子表上的列
我有種把ToList放在子選擇器中的工作,但這對我來說只是感覺不對。這是正確的方法嗎?
例子:
var query = _context.Set<order_header>()
.Where(oh => oh.customer == accountNo)
.Include(oh => oh.route_details)
.Select(oh => new order_header()
{
customer = oh.customer,
order_no = oh.order_no,
//other columns omitted
route_details = oh.route_details
.Select(rd => new route_detail() { route_code = rd.route_code})
.ToList()//this is odd
});
return query.ToList();
編輯: 我已經啓用了SQL跟蹤,我可以看到,這是做一個單獨的查詢來獲取每一個父行的孩子。所以這絕對是做錯事情的錯誤方式。
我開始認爲我必須將結果選擇爲匿名類型,然後生成EF模型。
EDIT2: 現在我已經刪除的子查詢ToList選擇,但SQL跟蹤顯示這是仍在運行,爲每一個父行的查詢。
代碼:
var query = _context.Set<order_header>()
.Where(oh => oh.customer == accountNo)
.Include(oh => oh.route_details)
.Select(oh => new
{
customer = oh.customer,
order_no = oh.order_no,
//other columns omitted
route_details = oh.route_details.Select(rd => rd.route_code)
});
var result = query.ToList();
var list = new List<order_header>();
list.AddRange(result.Select(a =>
new order_header()
{
customer = a.customer,
order_no = a.order_no,
//other columns omitted
route_details = a.route_details.Select(rc => new route_detail() { route_code = rc }).ToList()
}));
return list;
EDIT3 按照要求,SQL跟蹤:
父查詢
exec sp_executesql N'SELECT [oph].[customer], [oph].[order_no], [oph].[customer_order_no], [oph].[date_received], [oph].[date_required], [oph].[date_despatched], [oph].[status], [oph].[to_reference], [oph].[from_reference], [oph].[nett_value]
FROM [scheme].[order_header] AS [oph]
WHERE [oph].[customer] = @__accountNo_0',N'@__accountNo_0 varchar(8)',@__accountNo_0='ACC_NO'
兒童查詢
exec sp_executesql N'SELECT [avl].[route_code]
FROM [scheme].[route_detail] AS [avl]
WHERE @_outer_order_no = [avl].[ldordno]',N'@_outer_order_no varchar(10)',@_outer_order_no='1A469499 '
imgur鏈接 http://i.imgur.com/Q4ATQiU.png
注意,架構名稱是圖像中不同的,因爲我一直在編輯他們的提問。
這工作,但它仍然是對每一行執行查詢以獲取子記錄。你有沒有看到edit2? – jag
你確定沒有涉及觸發你的查詢的一些惰性加載嗎?我剛剛分析了一個與我發佈的類似的示例,並且僅針對選定的導航屬性獲取了包含連接的1個查詢。 –
懶惰加載尚未支持EF核心,我忘了那:)你可以發佈你的分析器輸出? –