每次sql调用检索带子项的实体。 ADO.NET实体框架

时间:2010-05-01 15:27:59

标签: linq ado.net entities

我有两张桌子:A& B

B {    B1:Field1,    B2:Field2,    ... }

一个 {    儿童:B的清单,    A1:Field1,    A2:Field2, }

我想检索具有相关“B”实体的“A”实体,如下所示:

DataContext.A.Select(a => new MySubset(A1 = a.A1,Children = a.Children.Select(b => b.B1)。 ToList()) ;

但EF无法将ToList转换为SQL,因此我必须在查询中为每个实例调用ToList(),从而产生额外的网络调用。

我该如何避免这种情况?

提前谢谢。

2 个答案:

答案 0 :(得分:0)

我会在MySubset的构造函数中使用IEnumerable而不是List。

或者:创建列表不是通过.ToList(),而是通过new List<T>(a.Children.Select(b => b.B1))

答案 1 :(得分:0)

您可以使用.Include语句进行预先加载:

http://msdn.microsoft.com/en-us/library/bb896272.aspx

<强>解释

假设您使用的是VS2010且启用了延迟加载:

当你最初加载A时,有一个B的集合显然在等你A,但它不是真的,它不是List&lt;&gt;,它是一个知道如何在你要求时提供B的对象。只有当您访问此集合时,EF才会执行到数据库的往返以获取它。

但是如果你使用.Include(),你可以请求它在获取A的同时获取B.