如何在LINQ

时间:2018-05-08 22:27:35

标签: vb.net linq

我正在尝试在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

1 个答案:

答案 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语句作为字符串。