1

我有这样的事情:

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 实体。我怎样才能正确地做到这一点?

4

1 回答 1

1

您不能申请Include投影(SelectSelectMany)中的属性。您需要扩展投影以将帖子作为附加属性包含在内:

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

Thread如果和之间的关系Post是一对多 EF 将填充Posts线程的集合。

如果您在实体上有一个逆ForumAccount属性,查询会容易得多:Thread

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

在这种情况下,急切加载Include将起作用。

于 2012-09-01T17:51:25.813 回答