我正在尝试在VB.net中重新创建一个类似Access / SQL的视图构建器
我有两个DataTables,AddressListDataTable和MatrixDataTable
这两个DataTable将与LINQ结合并添加到第三个名为CombinedDataTable的DataTable
我的问题是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
答案 0 :(得分:4)
为此,您可以使用Nuget Gallery中提供的Dynamic 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语句作为字符串。