Vb.net 如何在LINQ中创建变量Select语句

Vb.net 如何在LINQ中创建变量Select语句,vb.net,linq,Vb.net,Linq,我正在尝试在VB.net中重新创建一个类似Access/SQL的视图生成器 我有两个数据表,AddressListDataTable和MatrixDataTable 这两个数据表将与LINQ组合,并添加到第三个名为CombinedDataTable的数据表中 我的问题是AddressListDataTable和MatrixDataTable中的字段都会经常更改,因此我需要弄清楚如何构建自定义Select语句 这是我的密码: Dim both = From row1 In AddressListD

我正在尝试在VB.net中重新创建一个类似Access/SQL的视图生成器

我有两个数据表,AddressListDataTable和MatrixDataTable

这两个数据表将与LINQ组合,并添加到第三个名为CombinedDataTable的数据表中

我的问题是AddressListDataTable和MatrixDataTable中的字段都会经常更改,因此我需要弄清楚如何构建自定义Select语句

这是我的密码:

Dim both = From row1 In AddressListDatatable.AsEnumerable()
Join row2 In MatrixDatatable.AsEnumerable()
On row1.Field(Of String)("Offercode") Equals row2.Field(Of String("Code")
Select row1("Account") & "|" & row1("First") & "|" & row1("OFFERCODE") & "|" 
& row2("Expiration") & "|" & row2("OfferDescription")
这是我需要帮助的电话。我需要能够创建字段名的自定义列表,因为每次运行时列名都会更改:

Select row1("Account") & "|" & row1("First") & "|" & row1("OFFERCODE") & "|" 
& row2("Expiration") & "|" & row2("OfferDescription")
这段代码实际上可以工作,但它是一个手动解决方案

那么,如何在每次运行代码时创建自定义select语句呢

此外,以下是我如何将数据添加到CombinedDataTable:

 For Each r1r2 In both

        Dim words As String() = r1r2.Split(New Char() {"|"c})

        CombinedDataTable.Rows.Add(words)

    Next

为此,可以使用NuGet Gallery中提供的动态Linq库(System.Linq.Dynamic)。 在动态Linq中,可以动态生成select语句

因此,在添加引用后,您可以将代码更改为

    Dim both = (From row1 In AddressListDatatable.AsEnumerable()
                Join row2 In MatrixDatatable.AsEnumerable()
                On row1.Field(Of String)("Offercode") Equals row2.Field(Of String)("Code") Select row1, row2)


    Dim data = both.Select("new (row1.Account, row1.First, row1.OFFERCODE, row2.Expiration, row2.OfferDescription)")

因此,可以将select语句动态生成为字符串。

为此,可以使用NuGet Gallery中提供的动态Linq库(System.Linq.Dynamic)。 在动态Linq中,可以动态生成select语句

因此,在添加引用后,您可以将代码更改为

    Dim both = (From row1 In AddressListDatatable.AsEnumerable()
                Join row2 In MatrixDatatable.AsEnumerable()
                On row1.Field(Of String)("Offercode") Equals row2.Field(Of String)("Code") Select row1, row2)


    Dim data = both.Select("new (row1.Account, row1.First, row1.OFFERCODE, row2.Expiration, row2.OfferDescription)")

因此,您可以将select语句动态生成为字符串。

以下是最终对我有效的方法:

Dim addressListColumnNames As New List(Of String)
Dim matrixColumnNames As New List(Of String)

Dim both = From row1 In AddressListDatatable.AsEnumerable()
   Join row2 In MatrixDatatable.AsEnumerable()
   On row1.Field(Of String)("Offercode") Equals row2.Field(Of String("Code")
   Select addressListColumnNames.Select(Function(alcn) 
   row1(alcn)).Concat(matrixColumnNames.Select(Function(mcn) row2(mcn)))

Dim combinedDataTable As New DataTable

For Each result In both
    combineDataTable.Rows.Add(result.ToArray())
Next

以下是最终对我有用的东西:

Dim addressListColumnNames As New List(Of String)
Dim matrixColumnNames As New List(Of String)

Dim both = From row1 In AddressListDatatable.AsEnumerable()
   Join row2 In MatrixDatatable.AsEnumerable()
   On row1.Field(Of String)("Offercode") Equals row2.Field(Of String("Code")
   Select addressListColumnNames.Select(Function(alcn) 
   row1(alcn)).Concat(matrixColumnNames.Select(Function(mcn) row2(mcn)))

Dim combinedDataTable As New DataTable

For Each result In both
    combineDataTable.Rows.Add(result.ToArray())
Next

这可能行得通,但是我得到了一个错误:“类型‘DataRow’中不存在属性或字段‘Account’”。Harisyam,这是我在代码中遇到的问题的正确语法。Code:Dim data=both.Select(“new(row1[0]as Account)),这可能会起作用,但我遇到了以下错误:“DataRow”类型中不存在属性或字段“Account”。以下是我对您的代码Harisyam遇到的问题的正确语法。Code:Dim data=both.Select(“new(row1[0]as Account))