1

我有一个 Linq 查询,它从 SQL Server 返回很多结果,我想确保,我从数据库一次获取记录,然后简单地在页面内按需循环遍历记录而不访问数据库。

这是一个简单的查询:

Dim c1 = (From c2 In _db.CategoryRelationShip
        Select c2)

现在我在页面的某个地方:

For Each item In c1

Next

然后再一次:

For Each item In c1

Next

这是否意味着在每个 For 循环中,我都会一次又一次地访问数据库?还是我的原始 Linq 检索了所有记录,而我只是循环遍历数组/结果?

我听说过 toList() 方法,所以我很困惑我是否需要它?...我的意思是如果我这样做:

Dim c1 = (From c2 In _db.CategoryRelationShip
        Select c2).toList()
4

1 回答 1

2

LINQ 使用延迟执行,这意味着在您需要数据之前不会评估任何内容。这个说法:

Dim c1 = (From c2 In _db.CategoryRelationShip
          Select c2)

不从数据库中获取任何数据。正如 Gert Arnold 在对另一个答案的评论中所说:

c1只是一个等待发生的查询(延迟执行)。

所以是的。如果您只是迭代,您将执行两次查询c1。您可以轻松地验证这一点:

Dim myCollection As New List(Of Integer)(New () {1, 2})

Dim result = (From c In myCollection
              Select c)

For Each i As Integer In result
    Console.WriteLine(i)    ' Will print 1 and 2
Next

myCollection.Add(3)
Console.WriteLine()

For Each i As Integer In result
    Console.WriteLine(i)    ' Will print 1, 2 and 3
Next

您可以对数据库进行相同的测试。

为了避免调用数据库两次,您可以使用.ToList()它将“强制”评估查询并将结果存储在列表中。如果您要在上面的示例中替换(From c In myCollection Select c)(From c In myCollectionc Select c).ToList(),您将打印 1 和 2 两次。

于 2013-11-09T21:33:44.043 回答