LINQ在数据表之间连接,两个无类型字段

时间:2014-02-28 19:23:38

标签: vb.net linq system.data.datatable

我正在查询两个数据库并尝试使用LINQ加入结果集并查询它们。这似乎是一件容易的事,但如果没有明确的连接,我就会遇到重大的性能问题。当我进行显式连接时,我遇到了使用VB语法制作显式类型的问题。工作守则,清理:

        For Each CurrRow In ResultsA.Tables(15).Rows
            CurrDate = CurrRow("Date")
            CurrID = CurrRow("ID")
            CurrVal = CurrRow("Val")
            Dim ResultsB = From SMW In DataSetA.Tables(0).AsEnumerable() _
                           Where SMW("ID") = CurrScheduleID And SMW("Time") = CurrProfileDate _
                           Select UTC_TS = SMW("Time"), Value = (SMW("VALUE") / 1000), Time_Zone = SMW("Time_Zone"), ID = SMW("ID")

            Dim CurrentResult As Object
            Dim boolSchedDateFound As Boolean = False
            For Each CurrentResult In ResultsB
                If CurrentResult.Value <> CurrVal Then
                    'LogIntegrityCheckErrorRow()
                End If
                boolSchedDateFound = True
            Next
        Next

这需要FOREVER以100,000行运行。

我一直在尝试将其重写为:

        Dim MismatchRows = From TableAData In DataSetA.Tables(0).AsEnumerable() Join TableBData In DataSetB.Tables(15).AsEnumerable() _
                On New With {.TableAID = Convert.ToInt32(TableAData("ID")), .TableATime = Convert.ToDateTime(TableAData("Date"))} _
                Equals New With {.TableBDID = Convert.ToInt32(TableBData("ID")), .TableBTime = Convert.ToDateTime(TableBData("Time"))} _
            Select ..................  (Hard to clean up, but this isn't the part that's failing)

我正在忍受它的一段时间。根本问题是缺乏强有力的打字。我看了,但似乎没有什么建议,因为大多数人这样做会在数据上构建EF。这不是一个可怕的想法,但需要一堆重新设计。所以。在我面前出现问题,如何删除错误:

'Equals' cannot compare a value of type '<anonymous type> (line 2641)' with a value of type '<anonymous type> (line 2642)'.

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

你试过这个吗?

Dim MismatchRows = From TableAData In ei _
    Join TableBData In e2 On _
        TableAData("ID") Equals TableBData("ID") And TableAData("Data") Equals TableBData("Time")
    Select .......

答案 1 :(得分:0)

    db.tb_DeviceGeFenceDetail.Join(db.tb_InventoryLog, Function(gfd) gfd.DeviceID, Function(il) il.deviceId, Function(gfd, il) New From { _
gfd.GeFenceLat1, _
gfd.GeFenceLng1, _
gfd.GeFenceLat2, _
gfd.GeFenceLng2, _
il.deviceName, _
il.DeviceIcon, _
gfd.DeviceID, _
il.id _
}).ToList().Where(Function(y) intValues.Contains(y.id))

您可以尝试加入类似这样的表格。