我如何热切地将实体的子代和孙代元素包含在实体框架代码中?

问题描述:

想象三个实体(客户,图书,作者)相关的是这样的:我如何热切地将实体的子代和孙代元素包含在实体框架代码中?

客户有许多书籍

一本书有一个作者

我使用这些数据来打印这样的报告:

Customer: Peter 
    Book: To Kill a Mockingbird - Author: Harper Lee 
    Book: A Tale of Two Cities - Author: Charles Dickens 
Customer: Melanie 
    Book: The Hobbit - Author: J. R. R. Tolkien 

当我查询的客户,我得到,正如所料,一堆以下性质的查询

  1. 查询获得客户
  2. 每位客户查询得到他的书籍
  3. 每本书的查询,以获得其作者

我可以通过包括像这样的本本减少查询的次数:

var customers = db.Customers.Include(c => c.Books);

但我不知道如何加载第三级(作者)。我怎样才能做到这一点?

有用于Include接受一个字符串,它可以表示你需要的任何额外属性的完整路径过载:

var customers = db.Customers.Include("Books.Author"); 

这看起来很奇怪,因为“作者”不上的书集合的属性(而不是每本书的财产),但它的工作原理。给它一个旋转。

+7

亦幻串一个好主意? – LINQ 2016-07-26 21:33:18

+2

@jbueno如果可能的话,我会避免它们,因为如果您更改客户属性的名称,它们不会被编译器捕获。 – Ravvy 2016-12-16 00:42:34

+2

根据@ tdykstra的回答,您可以使用'Select'。 – 2016-12-28 13:46:32

此外,没有必要使用字符串重载。这种方法也可以工作:

var customers = db.Customers.Include(c => c.Books.Select(b => b.Author)); 

更多的例子看到EF团队的博客文章: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

本教程: http://www.asp.net/entity-framework/tutorials/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

+5

我认为这是一个更好的方法,因为它是强类型的,与弱类型的字符串Path相反。 – stack247 2013-04-10 03:25:49

+8

请注意,要使用此包括方法,您需要引用System.Data.Entity – jazza1000 2015-07-21 15:14:27

+1

这是一个很好的问题 - 答案检查出我。我尝试了6层深层次的层次结构,虽然它生成的SQL查询很庞大,但它比可能出现的数百个单独的选择语句更高效。 EF创建傻瓜式TSQL的方法! – 2015-12-02 03:11:13