2009-12-12 28 views
2

我期待成是關係到一個問題... Join and Include in Entity FrameworkLINQ中,爭相模仿連接,以及包括方法

基本上下面的查詢返回「屬性」列表中的對象當前用戶有權限( ACL)來查看。

IQueryable<Property> currPropList 
       = from p in ve.Property 
           .Include("phyAddress") 
           .Include("Contact") 
        from a in ve.ACLs 
        from u in ve.Account 
        from gj in ve.ObjectGroupJoin 
        where u.username == currUsername    // The username 
         && (a.Account.id == u.id    // The ACLs 
          && a.objType == (int)ObjectType.Group) 
         && (gj.ObjectGroup.id == a.objId  // The groups 
          && gj.objId == p.id)    // The properties 
        select p; 

查詢返回正確的屬性列表,並在大的工作正常。

但上面的linq查詢中的「包含」調用不會加載對象。如果我在LINQ查詢之後明確地調用「Load()」,那麼這些對象將被加載。

related SO question提示「Include」調用和where子句之間可能存在衝突。這怎麼可能?

但無論如何,我該如何重組這個查詢來加載「phyAddress」和「Contract」成員?具體來說,我只想加載返回的對象的成員,而不是數據庫中的所有「phyAddress」和「Contact」對象。

謝謝。

編輯

我從條款

這工作的問題追查到使用多個的...

IQueryable<Property> currPropList 
      = from p in ve.Property 
          .Include("phyAddress") 
       select p; 

與 「phyAddress」 成員是加載。

但是,這並不工作...

IQueryable<Property> currPropList 
      = from p in ve.Property 
          .Include("phyAddress") 
       from a in ve.ACLs 
       select p; 

基本上包括當有多個條款調用將被忽略。有沒有人知道這個工作?

編輯2

一種解決方法是投的IQueryable結果作爲的ObjectQuery並得到包括過這一點。但我想阻止第二次往返數據庫,我假設這會導致。

例如,這工作....

IQueryable<Property> currPropList 
     = ((from p in ve.Property 
      from a in ve.ACLs 
      select p) as ObjectQuery<Property>).Include("phyAddress"); 

有沒有辦法做到這一點只有一個單一的查詢?

編輯3

沒有第二個查詢,因爲延遲執行 [http://blogs.msdn.com/charlie/archive/2007/12/09/deferred-execution.aspx。所以編輯2將是解決方案。

+0

它只做一個sql查詢。沒有第二次往返。如果你不確定,你應該看看SQL Server Profiler。 – LukLed 2009-12-12 23:59:03

回答

4

這是包含...的一個已知問題,如果您執行某些更改查詢形狀的操作(即,從)然後包含丟失有簡單的解決方法,雖然:

  1. 你可以包裝圍繞查詢,請參閱Tip 22 - How to make include really include
  2. 或者您可以在select子句中獲得所需的一切,讓關係修復工作爲您完成工作。即

    var x = from p in ve.Property 
         from a in ve.ACLs 
         select new {p,p.phyAddress}; 
    
    var results = x.AsEnumerable().Select(p => p.p); 
    

查閱結果是屬性實體的枚舉,但每一個都有它phyAddress加載,對於phyAddress初始請求的副作用,和EF的關係修正。