我有一个名为dtContext的DataContext,它有许多实体。现在我在数据库中的数据是巨大的,所以我想知道如果我创建一个新的DataContext,我的数据库中的所有数据都会被提取到实体中吗?这意味着一旦新的完成,所有实体都会从我的数据库中填充数据?或者仅在从LINQ查询中调用实体时才获取数据? 例如:
line 1: dtContext dt = new dtContext();
line 2: IEnumerable<MyEntity> query = from q in dt.MyEntities select q;
MyEntities在哪一行代表数据库中的实际数据?
答案 0 :(得分:1)
在您枚举查询或致电ToList()
,ToArray()
等之前,它不会查询您的数据库。这称为Deferred Execution。
许多标准查询运算符在迭代时返回元素 过度使用foreach声明。这些运营商基本上没有 工作UNTIL请求第一个元素,然后暂停直到 请求下一个元素。在迭代返回的查询之前, 这些陈述中没有任何内部工作。这个 延迟执行允许您控制何时以及是否可能 进行了漫长的工作。
如果要立即实现查询,请调用ToList,ToArray 或任何其他需要枚举整个运算符的运算符 序列返回结果。
LINQ利用C#2.0中添加的语言功能,使其更简单 在编写迭代时一次返回一个元素的方法时 过度。 yield return语句基本上会挂起循环 返回一个值,准确地回到下次停止的地方 调用MoveNext。
MSDN库将使用延迟执行的运算符描述为:
此方法使用延迟执行实现。眼前的 返回值是一个存储所需信息的对象 执行动作。此方法表示的查询不是 执行,直到通过调用它来枚举对象 直接使用GetEnumerator方法或在Visual C#或For中使用foreach 每个都在Visual Basic中。
答案 1 :(得分:1)
没有答案。由于您没有编写查询,因此第一行不会获取任何数据。第二行不会获得任何数据,因为您只是编写了查询但没有执行它。迭代结果时可以执行查询(如foreach,ToArray(),First()等)
答案 2 :(得分:1)
您指的是名为急切加载和延迟加载,you might find this useful,and also this的功能。
答案 3 :(得分:0)
您尝试迭代查询结果集的点。
如果要撤回数据的子集,请在查询中添加where子句。