2011-06-08 53 views
0

如果我有一組表,TableA,TableB,TableC和TableD與TableA與TableB,TableC和TableD有一對多的關係。實體框架 - 選擇帶或不帶關係

有時候我想返回整個TableA,TableB,TableC和TableD的集合。有時我只想返回TableA。

此刻,我有以下幾點:

TableA tableA; 

if (includeRelationships) 
{ 
    tableA = (from a in context.TableAs 
        .Include("TableBs") 
        .Include("TableCs") 
        .Include("TableDs") 
       where a.Id = myId 
       select a).SingleOrDefault(); 
} 
else 
{ 
    tableA = (from a in context.TableAs 
       where a.Id = myId 
       select a).SingleOrDefault(); 
} 

// do stuff with tableA 

這是做到這一點的唯一途徑?

編輯 - 澄清以下feanz的回答是:

所以它需要一個單一的數據庫調用這將公開爲WCF服務,或者所有表或單個表A,使懶/延遲加載是不是選項。

回答

0

Becasue EF支持延遲加載默認情況下,第二個例子:

tableA = (from a in context.TableAs 
      where a.Id = myId 
      select a).SingleOrDefault(); 

還會有TableBs,TableCs和TableDs因爲您可以訪問的參數。第一次訪問這些參數時,EF應該激發查詢以獲取適當的信息。這可能是一個性能問題,並導致N + 1問題,但是在某些情況下,像您提到的那樣,您可能不希望總是獲取數據。

+0

啊,大概應該補充說這是WCF服務的一部分,所以根據你鏈接到的文章,懶惰加載並不是一個真正的選項 – Shevek 2011-06-08 17:27:50

+0

,你必須在引用訪問之前具體'.Load()' ,它不會自動完成。無論哪種方式,它仍然意味着多次訪問數據庫而不是一個,所以它不適合這個應用程序。 – Shevek 2011-06-08 21:20:08

-1

使用

context.ContextOptions.LazyLoadingEnabled = true; 
+0

該問題特別說明「懶/延期加載不是一個選項」... – 2012-10-02 03:50:41

0

做這樣

var query = context.TableA; 
if (includeRelationships) 
{ 
    query = query.Include("Tableb").Include("TableC").Include("TableD"); 
} 
var tablea = query.SingleOrDefault(); 

在這種情況下,一些正在使用的事實,即擴展方法 「包含」 發生,並返回一個IQueryable。您可能想要使用:

query.Include(x => x.TableB)... 

將表達式作爲參數的方法的重載。這樣編譯器會爲你做檢查。如果您使用的是較舊版本的EF,則可能無法訪問它。