我有这样的事情:
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实体。我怎么能正确地做到这一点?
答案 0 :(得分:1)
您无法在投影(Include
或Select
)中对属性应用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();
如果Thread
和Post
之间的关系是一对多EF,则会填充Posts
个帖子的集合。
如果ForumAccount
实体上有一个反Thread
属性,查询会更容易:
var threads = _forumsDb.Threads
.Include("Posts")
.Where(t => t.ForumAccount.UserName == User.Identity.Name)
.ToList();
在这种情况下,使用Include
进行预先加载会有效。