包括导航属性

时间:2015-10-28 13:53:47

标签: c# asp.net entity-framework

我有一个类Conversation,它有一个导航属性List<Message> Messages,每个Message都有一个导航属性User Owner,现在当我做一些像

这样的事情时
        foreach (var item in conversation.Messages.ToList())
        {
            //Do something with item.Owner.Name
        }

它会针对每个项目点击数据库。所有者......

conversation.Messages.ToList()

中提取邮件时,如何急切加载邮件所有者?

2 个答案:

答案 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表达式作为参数传递,该表达式表示要包含的路径。恕我直言这是更好的选择,因为它是强类型的,如果你改变你所包含的某个属性的名称,你将有一个编译错误。