0

我有一个名为 dtContext 的 DataContext,它有很多实体。现在我在数据库中的数据很大,所以我想知道如果我创建一个新的 DataContext 是否会将我数据库中的所有数据提取到实体中?意味着一旦更新完成,所有实体都填充了我数据库中的数据?还是仅在您从 LINQ 查询中调用实体时才获取数据?例如:

line 1: dtContext dt = new dtContext();
line 2: IEnumerable<MyEntity> query = from q in dt.MyEntities select q;

在哪一行 MyEntities 将代表数据库中的实际数据?

4

4 回答 4

1

ToList()在您枚举查询或调用,等之前,它不会查询您的数据库ToArray()。这称为延迟执行

许多标准查询运算符在使用 foreach 语句进行迭代时返回元素。这些操作符在请求第一个元素之前基本上没有工作,然后暂停直到请求下一个元素。在迭代返回的查询之前,不会对任何这些语句在内部执行任何工作。这种延迟执行允许您控制何时以及是否执行潜在的冗长工作。

如果您希望立即实现查询,请调用 ToList、ToArray 或任何其他需要枚举整个序列以返回结果的运算符。

LINQ 利用了 C# 2.0 中添加的一种语言功能,该功能在编写迭代时一次返回一个元素的方法时变得更简单。yield return 语句本质上通过返回一个值来暂停循环,并在下次调用 MoveNext 时准确地从它停止的地方开始。

MSDN 库将使用延迟执行的运算符描述为:

此方法使用延迟执行来实现。立即返回值是一个存储执行操作所需的所有信息的对象。在通过直接调用其 GetEnumerator 方法或使用 Visual C# 中的 foreach 或 Visual Basic 中的 For Each 枚举对象之前,不会执行此方法表示的查询。

于 2012-08-08T13:17:08.723 回答
1

没有答案。由于您没有编写查询,因此第一行不会获得任何数据。第二行也不会得到任何数据,因为您刚刚编写了查询但没有执行它。可以在迭代结果时执行查询(如 foreach、ToArray()、First() 等)

于 2012-08-08T13:17:31.223 回答
1

您指的是称为急切加载延迟加载的功能,您可能会发现这很有用还有这个

于 2012-08-08T13:18:02.817 回答
0

您尝试迭代查询的结果集的点。

如果要拉回数据的子集,请在查询中添加 where 子句。

于 2012-08-08T13:16:28.417 回答