2012-09-01 91 views
1

我有這樣的事情:Linq擴展方法 - 如何包含未加載的對象?

var threads = _forumsDb.ForumsAccounts 
.Where(a => a.UserName == User.Identity.Name) 
.SelectMany(u => u.Threads); 

但是,這些線程實體具有與它們相關聯的帖子的實體,這不加載由於懶加載。如果我做這樣的事情:

var threads = _forumsDb.ForumsAccounts 
.Include("Posts") 
.Where(a => a.UserName == User.Identity.Name) 
.SelectMany(u => u.Threads); 

它顯然不工作,並且那些線程實體仍然有空郵件實體。我如何正確地做到這一點?

+0

如何設置ForumsAccount和Posts之間的關係,Include(x => x.Posts)是否編譯? – tschmit007

+0

我不能在include中執行lambda表達式,只能輸入字符串,而對於我的表設置,ForumsAccount包含icollection的帖子和icollection的帖子,而線程實體包含icollection的帖子。 – ojek

+0

如果你有一個使用System.Data.Entity,你不能使用lambda的事實可能意味着,從EF的角度來看,關係沒有被正確設置。 – tschmit007

回答

1

對投影屬性(SelectSelectMany),您無法應用Include。您需要延長投影到包括職位作爲一個附加屬性:

var threads = _forumsDb.ForumsAccounts 
    .Where(a => a.UserName == User.Identity.Name) 
    .SelectMany(u => new 
    { 
     Threads = u.Threads, 
     ThreadPosts = u.Threads.Select(t => t.Posts) 
    }) 
    .AsEnumerable() 
    .SelectMany(a => a.Threads) 
    .ToList(); 

如果ThreadPost之間的關係是一個一對多EF將填補Posts收集的線程。

var threads = _forumsDb.Threads 
    .Include("Posts") 
    .Where(t => t.ForumAccount.UserName == User.Identity.Name) 
    .ToList(); 

在這種情況下,預先加載與Include將工作:

,如果你對Thread實體逆ForumAccount屬性的查詢會雖然容易得多。

+0

哦,這很有趣,謝謝。而第二種方法肯定更容易實現,它的工作原理,我沒有考慮這樣做,顯然今天有太多的編程。 :) 再一次感謝你。 – ojek