Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 每次sql调用检索具有子级的实体。ADO.NET实体框架_Linq_Ado.net_Entities - Fatal编程技术网

Linq 每次sql调用检索具有子级的实体。ADO.NET实体框架

Linq 每次sql调用检索具有子级的实体。ADO.NET实体框架,linq,ado.net,entities,Linq,Ado.net,Entities,我有两张桌子:A和B B{ B1:字段1, B2:Field2, ... } A { 孩子们:B名单, A1:字段1, A2:字段2, } 我想检索具有相关“B”实体的“A”实体,如下所示: DataContext.A.Select(A=>newmysubset(A1=A.A1,Children=A.Children.Select(b=>b.B1)。ToList()) 但EF无法将ToList转换为SQL,所以我必须在查询中为每个实例调用ToList(),从而生成额外的网络调用 我怎样才能避免

我有两张桌子:A和B

B{ B1:字段1, B2:Field2, ... }

A { 孩子们:B名单, A1:字段1, A2:字段2, }

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

DataContext.A.Select(A=>newmysubset(A1=A.A1,Children=A.Children.Select(b=>b.B1)。ToList()

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

我怎样才能避免这种情况


提前谢谢。

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


或者:不是通过.ToList()创建列表,而是通过
新建列表(a.Children.Select(b=>b.B1))
您可以使用
。Include
语句来执行快速加载:

解释

假设您在VS2010上并且启用了延迟加载:

当您最初加载A时,A中显然有一个B的集合在等待您,但它不是真的,它不是一个列表,它是一个在您请求时知道如何提供B的对象。只有当您访问此集合时,EF才会往返数据库以获取它


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

是的,现在,我在MySubset中声明IEnumerable属性&当我开始枚举它时,会进行新的sql调用(当我枚举它们的属性时,10个MySubset实例会再生成10个网络调用)。或者我可能错了吗?在中编辑了一些内容。即使是原始语句中的.ToList()也会生成另一个网络调用。抱歉,EF中只允许使用无参数构造函数。我正在查看即时加载(.Include方法)抱歉,它看起来像相关的(列表“B”)包含为导航属性的实体已在最外层投影中。如何使用我的SQL Express Studio确保其为真?检索到“A”实体后,我会停止数据库,停止的数据库可以访问该实体的“B”集合。看起来像是用“A”检索到“B”在一次呼叫中。我为您添加了一个解释-如果您只获取了A,那么这个B的集合就没有被实例化。感谢您的解释,但是如果获取了“A”属性的投影,该怎么办。“MySubset”具有“A”属性和IEnumerable属性。您可以将其存储为IEnumerable,但EF实际提供的是EntityCollection。IEnumerable通常在您开始枚举它之前不会执行任何操作。在这种情况下,当您向EntityCollection请求第一项时,如果您没有请求它加载集合,它将延迟加载集合广告使用。包括(“B”)。