Vb.net 如何在LINQ中创建变量Select语句
我正在尝试在VB.net中重新创建一个类似Access/SQL的视图生成器 我有两个数据表,AddressListDataTable和MatrixDataTable 这两个数据表将与LINQ组合,并添加到第三个名为CombinedDataTable的数据表中 我的问题是AddressListDataTable和MatrixDataTable中的字段都会经常更改,因此我需要弄清楚如何构建自定义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
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))