linq使用的奇怪行为

时间:2014-12-29 10:12:21

标签: linq ienumerable

我有两个表(t1和t2),我从这些表中选择两个字段(f1和f2)。

列表查询包含所选数据。在这种情况下,有2行2行。

这是代码:

Dim FieldIndexes As New List(Of Integer)
Dim Queries As New List(Of IEnumerable(Of Object()))
For i = 0 To _SqlSyntaxChecker.QueriedTables.Count - 1
    FieldIndexes.Clear()
    For j = 0 To _SqlSyntaxChecker.DataFields.Count - 1
        If _SqlSyntaxChecker.QueriedTables(i).TableName = _SqlSyntaxChecker.DataFields(j).TableName Then FieldIndexes.Add(_SqlSyntaxChecker.DataFields(j).FieldIndexInDataTable)
    Next
    Dim query = _SqlSyntaxChecker.QueriedTables(i).Rows.Select(Function(Row) FieldIndexes.Select(Function(FieldIndex) Row.Item(FieldIndex)).ToArray)
    Queries.Add(query)
    For Each item In Queries(i)
        _OutputDataTable.Rows.Add(item)
    Next
Next

这就是结果:

enter image description here

正如你所看到的,一切都很好,我期待这个结果(现在不重要,我在图像上有4行一行)。

最初,我想在cykle之外填充_OutputDataTable,如下所示:

Dim FieldIndexes As New List(Of Integer)
Dim Queries As New List(Of IEnumerable(Of Object()))
For i = 0 To _SqlSyntaxChecker.QueriedTables.Count - 1
    FieldIndexes.Clear()
    For j = 0 To _SqlSyntaxChecker.DataFields.Count - 1
        If _SqlSyntaxChecker.QueriedTables(i).TableName = _SqlSyntaxChecker.DataFields(j).TableName Then FieldIndexes.Add(_SqlSyntaxChecker.DataFields(j).FieldIndexInDataTable)
    Next
    Dim query = _SqlSyntaxChecker.QueriedTables(i).Rows.Select(Function(Row) FieldIndexes.Select(Function(FieldIndex) Row.Item(FieldIndex)).ToArray)
    Queries.Add(query)
Next

For Each q In Queries
    For Each item In q
        _OutputDataTable.Rows.Add(item)
    Next
Next

但是如你所见,结果是错误的:

enter image description here

结果应该是一样的。

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

您的查询已链接到i字段(使用闭包)。但查询是在第一个周期后执行的,因此i在执行查询时已经有了它的最后一个值。

您可以检查"访问修改后的关闭"互联网主题(主要是关于代表的,但实际上同样适用于表达树)。