Linq扩展方法 - 如何包含未加载的对象?

时间:2012-09-01 16:43:54

标签: linq entity-framework ef-code-first

我有这样的事情:

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);

它显然不起作用,并且那些线程实体仍然具有空的Posts实体。我怎么能正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

您无法在投影(IncludeSelect)中对属性应用SelectMany。您需要扩展投影以将帖子包含为附加属性:

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个帖子的集合。

如果ForumAccount实体上有一个反Thread属性,查询会更容易:

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

在这种情况下,使用Include进行预先加载会有效。