2011-09-12 90 views
4

所以我有類似這樣的類。EF - 爲什麼不包含屬性

public class User { 
    public virtual IList<Member> Members {get;set;} 
} 

public class Member { 
    public virtual AnotherTable Another {get;set;} 
} 

public class AnotherTable { 
    public string Name {get;set;} 
} 

當我直接對DataContext的執行查詢包括的作品,但是當我對成員的IList做一個AsQueryable已()的包括不起作用。

有沒有一種方法可以在延遲加載屬性(例如上面的Members屬性)上使用Include/Eager功能,還是我總是必須通過DataContext才能獲得該功能?

User.Members.AsQueryable().Include(a => a.Another).ToList() // <-- nada, no way Jose 
_db.Members.Include(m => m.Another).ToList() // <-- all good in the neighborhood 

我問原因也可以是一個SQL語句對100個查詢的東西,結果相當於一個巨大的差異。

在此先感謝。

回答

3

AsQueryable不會使它進行linq-to-entities查詢。它仍然是在List之上的Linq-to-object查詢。 List不知道如何處理Include - 只有DbQuery知道它,所以你必須讓DbQuery

var entry = context.Entry(user); 
entry.Collection(u => u.Member).Query().Include(m => m.Another).Load(); 
0

你必須要經過的DbContext,以便包括()工作。你可以將它抽象成一個Repository,但是你仍然需要將你的Include()表達式傳遞給你的底層上下文。

private IQueryable<T> GetQuery<T>(params Expression<Func<T, object>>[] includeProperties) where T : class 
    { 
     IQueryable<T> query = _db.Set<T>(); 

     if (includeProperties != null) 
     { 
      foreach (Expression<Func<T, object>> expression in includeProperties) 
      { 
       query = query.Include(expression); 
      } 
     } 

     return query; 
    } 
+0

這是一個很好的答案解決方案,剛剛結束了在我的datacontext上爲常見查詢場景創建專用屬性。雖然也可以實施這個。 –

-1

我也面臨着同樣的問題。

我解決了這個剛剛將基準System.Data.Entity的&使用以下命名空間:

using System.Data.Entity; 

你可以用它試試。

相關問題