我有一个类Conversation,它有一个导航属性List<Message> Messages
,每个Message都有一个导航属性User Owner
,现在当我做一些像
foreach (var item in conversation.Messages.ToList())
{
//Do something with item.Owner.Name
}
它会针对每个项目点击数据库。所有者......
在conversation.Messages.ToList()
?
答案 0 :(得分:2)
在您的存储库中,您可以像这样进行对话:
return (from c in context.Conversation
where <your where clause>
select c).Include(x => x.Messages.Select(m => m.Owner)).FirstOrDefault();
答案 1 :(得分:2)
要急切加载多个嵌套级别,您有两个选择:
使用DbQuery<TResult>.Include
方法。在你的情况下,它将是:
var query= context.Conversations.Include("Messages.Owner");
此方法接收您希望包含在查询结果中的相关对象的路径作为参数。
使用QueryableExtensions.Include
扩展方法。在你的情况下,它将是:
var query= context.Conversations.Include(c=>c.Messages.Select(m=>m.Owner));
在这种情况下,您需要将一个lambda表达式作为参数传递,该表达式表示要包含的路径。恕我直言这是更好的选择,因为它是强类型的,如果你改变你所包含的某个属性的名称,你将有一个编译错误。