我如何热切地将实体的子代和孙代元素包含在实体框架代码中?
问题描述:
想象三个实体(客户,图书,作者)相关的是这样的:我如何热切地将实体的子代和孙代元素包含在实体框架代码中?
客户有许多书籍
一本书有一个作者
我使用这些数据来打印这样的报告:
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
当我查询的客户,我得到,正如所料,一堆以下性质的查询
- 查询获得客户
- 每位客户查询得到他的书籍
- 每本书的查询,以获得其作者
我可以通过包括像这样的本本减少查询的次数:
var customers = db.Customers.Include(c => c.Books);
但我不知道如何加载第三级(作者)。我怎样才能做到这一点?
答
有用于Include
接受一个字符串,它可以表示你需要的任何额外属性的完整路径过载:
var customers = db.Customers.Include("Books.Author");
这看起来很奇怪,因为“作者”不上的书集合的属性(而不是每本书的财产),但它的工作原理。给它一个旋转。
答
此外,没有必要使用字符串重载。这种方法也可以工作:
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
亦幻串一个好主意? – LINQ 2016-07-26 21:33:18
@jbueno如果可能的话,我会避免它们,因为如果您更改客户属性的名称,它们不会被编译器捕获。 – Ravvy 2016-12-16 00:42:34
根据@ tdykstra的回答,您可以使用'Select'。 – 2016-12-28 13:46:32