0

背景是我剛剛開始使用EntityFramework的團隊;首先我們設計了數據庫,把所有的表格關係放到位,外鍵等等。然後通過visual studio添加一個新的ADO.NET實體數據模型,並且自動奇蹟般地獲得代表整個數據庫的生成的edmx文件!ADO.NET實體框架 - 如何僅從一個表中選擇數據(並忽略其他表)?

現在我專注於爲所有下拉列表和查找列表提供數據的兩個表格;

TLookupDomain (domainID, domainName, domainDesc) 

TLookup (lookupID, domainID, lookupCode, lookupDisplay, lookupDesc, sortOrder) 

關係是由左到右1-M會:

TLookupDomain - < TLookup - < TOther(+另外30個左右的其他表)

所以lookupId所是一家外商關鍵多達30桌;

IQueryable<TLookup> qList = from l in ctx.TLookups 
          where l.domainID == 24 
          select l; 
foreach (TLookup l in qList) 
{ 
    //do something. 
    System.Diagnostics.Debug.WriteLine("{0}\t{1}", l.lookupCode, l.lookupDisplay); 
    foreach (TOther f in l.TOthers) 
    { 
     System.Diagnostics.Debug.WriteLine("{0}\t{1}", f.feeAmount, f.feeDesc); 
    } 
} 

當我執行上面的LINQ,我得到TLookup表中的所有字段(這是公平的),但數據也獲取了鏈接到它的30頁左右的表,即使我不此時對其他表格的數據感興趣,並且我將在LINQ獲取數據時立即丟棄所有數據。

兩個問題,我有: 問題1)我可以以某種方式修改LINQ查詢以上或以其他方式告知的EntityFramework不會從其他30個鏈接表煩fetchin數據?問題2)是否有一個模型化整個數據庫的edmx文件是「正確的」? (聽起來狡猾)。

回答

1

爲模型配置Lazy Load爲true。關係只應在加載時加載。您也可以拆分模型以避免太多不必要的關係。

+0

非常簡潔但可能是第一個正確的答案,所以我會去那。正如Ladislav Mrnka所說,懶加載默認情況下已經啓用,所以它的合理性是我得到其他數據,因爲我在第二個foreach迭代器中導航; (當我得到時間我會做一些測試,看看實際發送到SqlServer,它是否得到任何SQL查詢導航!) – joedotnot 2011-03-15 23:30:30

+0

+1爲好答案:) – 2012-04-14 04:41:35

1

Linq-to-Entities查詢不會自動獲取任何內容。導航屬性的獲取通過急切或延遲加載來執行。您沒有使用急切加載,因爲這需要在查詢中調用Include(或單獨使用ctx.LoadProperty)。所以如果你的數據被提取,它必須是由於延遲加載,默認啓用。一旦你訪問代碼中的導航屬性,延遲加載觸發器。

您還可以通過使用投影返回所需的數據。這樣的事情應該返回只讀數據:

var query = from l in ctx.TLookups 
      where l.domainId == 24 
      select new 
       { 
       l.lookupCode, 
       l.lookupDisplay, 
       l.TOthers 
       }; 

具有一個或多個EDMX是常見的困境。使用單個EDMX使事情變得更簡單。如果你想知道如何使用多個EDMX並共享概念定義,請查看這兩篇文章:Part 1Part 2

+0

感謝您的信息答案和示例文章;只是想知道如果按照您的示例使用投影,在內部它只是獲取指定的列,或者將所有內容和過濾作爲事後事件來處理? – joedotnot 2011-03-15 23:19:48

+0

它僅爲所需列生成選擇命令。 – 2011-03-16 00:02:51

+0

+1爲好答案:) – 2012-04-14 04:42:03

相關問題