2017-04-13 58 views
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

注意,架構名稱是圖像中不同的,因爲我一直在編輯他們的提問。

回答

0

你可以做匿名類型中選擇,然後這將導致一個查詢適當的連接,這樣的事情(不知道我得到了你的導航屬性右):

var query = from oh in _context.Set<order_header>() 
      where oh.customer == accountNo 
      select new 
      { 
       oh, 
       oh.route_details, 
       oh.customer, 
       // other navigation properties to include 
       route_details = from rd in oh.route_details 
           // your child table filtering here 
           select new 
           { 
            rd, 
            rd.route_code, 
            // other child nav properties to include 
           } 
      }; 

return query.AsEnumerable().Select(m => m.oh).ToList(); 
+0

這工作,但它仍然是對每一行執行查詢以獲取子記錄。你有沒有看到edit2? – jag

+0

你確定沒有涉及觸發你的查詢的一些惰性加載嗎?我剛剛分析了一個與我發佈的類似的示例,並且僅針對選定的導航屬性獲取了包含連接的1個查詢。 –

+0

懶惰加載尚未支持EF核心,我忘了那:)你可以發佈你的分析器輸出? –

相關問題