2010-07-08 52 views
1

我有以下命令:實體框架 - 使用一個查詢從表中加載包含1:1表的數據?

var query = from x in context.FirstTable.Include("SecondTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 

現在我也想從一個名爲「ThirdTable」第三個表加載項。 但我只能通過SecondTable表引用它。有一個從FirstTable到SecondTable的外鍵和從SecondTable到ThirdTable的一個外鍵,但從FirstTable到ThirdTable都沒有。

使用以下查詢是不可能的。唯一的例外是,它不能從導航到FirstTable ThirdTable:

var query = from x in context.FirstTable.Include("SecondTable").Include("ThirdTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 

或者我需要爲每一個結果集我從該查詢回做ThirdTable其他查詢?

非常感謝您提前!

克雷格斯頓茨:

我有以下外鍵:表1 < - >表2 < - >表3
假設表有以下幾種方式:訂單< - >客戶< - > customer_preferences

所以我不需要從訂單到customer_preferences創建一個外鍵。
大部分時間都沒有必要。就在這一次,我想安全一些額外的數據庫往返。

+0

你有一個非常好的理由*沒有任何一端FKs? – 2010-07-08 19:54:43

+0

我有外鍵,但從Table1到Table3的FKs在我看來是不必要的。請參閱我更新的帖子。或者你認爲我應該在訂單表中添加customer_preference_id? – Chris 2010-07-08 20:34:30

+0

好吧,聽起來你有需要的FK。我會在下面回答。 – 2010-07-09 12:35:24

回答

2

您可以通過預先加載做到這一點:

var query = from x in context.FirstTable.Include("SecondTable.ThirdTable") // remember, these are property names, not table names 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select x; 

或(這是方法我主要使用)投影:

var query = from x in context.FirstTable 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select new PresentationModel 
      { 
       FirstTableColumn = x.Something, 
       SecondTableColumn = x.SecondTable.SomethingElse, 
       ThirdTableColumn = x.SecondTable.ThirdTable.StillMore 
      }; 

這假設SecondTable:ThirdTable是1:1(你不說)。如果它是1:*,你會這樣做:

var query = from x in context.FirstTable 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select new PresentationModel 
      { 
       FirstTableColumn = x.Something, 
       SecondTableColumn = x.SecondTable.SomethingElse, 
       ThirdTableStuff = from y in x.SecondTable.ThirdTable 
            select y.StillMore 
      }; 
+0

謝謝,這正是我一直在尋找的! – Chris 2010-07-09 17:02:56

1

如果我沒有記錯,包含只適用於第一個表。你可以做這樣的事情,而不是:

var query = from x in Invoices 
    join p in Products 
    on x.Invoice_id equals p.Invoice_id 
    join c in Customers 
    on x.Customer_id equals c.Customer_id 
    where p.Customer_id == 123 
    && c.Description == "some description" 
    select x; 

你也可以嘗試這樣的事情

var query = from x in context.FirstTable.Include("SecondTable").Include("SecondTable.ThirdTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 
+1

在EF查詢中,幾乎不需要連接(如果您具有正確的結構化數據庫並正確定義了模型)。實際上,你的答案是爲什麼沒有連接的查詢更具可讀性的一個很好的例子。順便說一句,如果激活加載被啓用,整個實體圖將被提取,並且包含將不是必需的。 – Yakimych 2010-07-08 19:04:17

相關問題