如何避免在Linq to SQL中立即加载关联数据

时间:2009-11-23 12:34:15

标签: linq-to-sql

假设我有一个看起来如下的实体

public Order OrderEntity 
{      
   EntityRef<Customer> CustomerEntity;      
   EntitySet<OrderDetail> OrderDetailEntity;      
   ...      
   ...
}

当我检索OrderEntity并将其转换为List时,L2S也会检索CustomerEntity中的实体以及OrderDetailEntity中的所有实体(以及所有子实体等)。通常我们不想要这种行为。如何告诉L2S不要这样做?

谢谢 - 兰迪

3 个答案:

答案 0 :(得分:0)

创建要启用的数据上下文集deferred loading后。

dataContext.DeferredLoadingEnabled = true;
  

当代码访问其中一个关系时,如果关系是一对一,则返回null,如果是一对多,则返回空集合。仍然可以通过设置LoadOptions属性来填充关系。

     

此属性的主要方案是使您能够提取对象模型的一部分并将其发送出去(例如,发送到Web服务)。

请参阅与对象跟踪交互的其他备注。

答案 1 :(得分:0)

re:EntitySet,LINQ-to-SQL只会延迟加载这些实体。

要证明这一点,请检索我们的OrderEntity,然后处理您的数据上下文。除了说你无法从已处置的上下文中检索更多数据之外,你会得到一个。

您可以强制LINQ-to-SQL使用LoadOptions类加载这些子实体,但不能强制它加载它们。默认情况下,它们未加载。

我不知道您是否可以删除对父实体的引用。

答案 2 :(得分:0)

延迟加载EntityRefs / Sets是默认的L2S行为。

有一件事可能会让你不这么认为,在Visual Studio调试器中观察你的实例会访问ref'd属性,导致它们被加载。这可能会让他们看起来像是在急切地加载,而实际上它只是VS.

要准确查看正在加载的内容以及何时加载,请将上下文的Log属性设置为Console.Out。这会将任何已执行的命令输出到Visual Studio输出窗口。