2011-11-23 40 views
3

我們遇到了在實體之間導航的問題,其中之一基於視圖。 問題是,當我們去實體框架 - 視圖中的數據加載過多

TableEntity.ViewEntity.Where(x => x.Id == Id).FirstOrDefault()) 

在後臺被加載在其中不是我們想要的或希望的視圖中的所有記錄。

然而,當我們去

_objectContext.TableEntityView 
    .Where(x => x.TableObjectId == TableObjectId && x.Id == Id) 

那麼它只是加載了一排是我們所使用的導航屬性期待

總之什麼原因導致大量的數據負載 - 它就像查詢早日實現。

我們將EF 4與SQL 2005數據庫結合使用。這些視圖用於提供彙總的信息,如果沒有大數據負載(具有諷刺意味的),EF無法輕鬆完成。我們手動構建了1:視圖之間的許多關聯。

爲什麼我們會在第一個實例中獲得大數據負載,而不是第二個?

非常感謝所有/任何幫助

回答

2

這就是導航集合在EF是如何工作的:訪問該集合加載所有實體,並在運行之後,只需要查詢對內存中的對象的任何LINQ查詢。我不認爲你可以做任何事情,因爲它沒有像你已經完成的自定義查詢。

FWIW我被告知NHibernate支持更精細的導航加載,但該功能尚未進入實體框架。

編輯

This answer從拉吉斯拉夫Mrnka顯示了CTP天可能解決您的問題。不知道自那以後有什麼變化。它使用DbContext,所以你仍然無法通過導航屬性進行搜索,但它可能與你將要獲得的內容相近。

int count = context.Entry(myAccount) 
        .Collection(a => a.Orders).Query().Count();` 

或你的情況,我猜測這將是

TableEntityView obj = context.Entry(TableEntity) 
          .Collection(a => a.ViewEntity) 
          .Query().FirstOrDefault(x => x.Id == Id); 
+0

感謝@Adam Rackis。但是,如果我去Table1.Table2.Where(x => x.Id == Id),它肯定不會加載表2中的所有內容。我的理解是,因爲它是IQueryable而不是IEnumerable,因此它將所有內容都一次性發送到服務器 - 當您意識到查詢(即使用ToList())時觸發。否則,導航屬性在EF中不可用。 –

+0

是的,你是對的。導航屬性不是IQueryable。開箱即用的行爲對於大多數情況來說可能是最好的。如果你需要更細粒度的控制,也許NH對你來說會是一個更好的ORM? (這是來自巨大的EF粉絲,順便說一句) –

+0

@Tim,也見我的編輯。這可能是使用DbContext的可能,但仍然不可能通過犁過對象導航屬性 –

1

我有一些問題與的EntityFramework生成SQL所以首先我會建議你使用LinqPad方式和一個或多個以下內容:EntityFramework profiler(支付軟件),SQL事件探查器(假設您正在使用SQL Server)和/或EFTracingProvider

我有問題,其中一些查詢所以擁有這些工具屬lly有助於找出造成問題的原因。

,我已經試過了經常做一些查詢的東西跑得更快:

寫一個完整的LINQ查詢,而不是使用Lambda表達式:他們往往更容易閱讀,他們看起來更像是SQL等等它更容易看到您的代碼和所生成的SQL的關係

EntitySet.Include(X => x.Property)

這告訴Linq2Entities在查詢中包含屬性