通过动态LINQ查询数据表

时间:2020-07-19 10:23:47

标签: vb.net linq datatable

我有一个DataTable,喜欢通过Dynamic LINQ查询。

Imports System.Linq.Dynamic.Core
...
Dim Values as DataTable
...

例如,当我简单地选择一个特定列(名为“年龄”)时,​​有效的方法是

    Dim result = Values.AsEnumerable.AsQueryable.Select("age")

但是现在我想通过where子句过滤DataTable,这不起作用,或者我不知道如何正确实现它:

Dim result = Values.AsEnumerable.AsQueryable.Where("age > 60")

我在这里:

“未为System.Object和 System.Int32“

好的,我在某种程度上理解了错误消息,但是我不知道该如何相应地更改代码。

3 个答案:

答案 0 :(得分:0)

这是Linq to DataTable的示例。 LoadCoffeeTable返回一个DataTable。类型和名称都是数据表中的字符串字段。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dt = LoadCoffeeTable()

    Dim result = From r As DataRow In dt.AsEnumerable
                 Where r("Type").ToString() = "Regular"
                 Select r("Name")

    For Each r In result
        Debug.Print(r.ToString)
    Next
End Sub

答案 1 :(得分:0)

如评论中所述,如果使用强类型的数据表,它将使您的生活大大增加。这些是由设计人员生成的数据表,具有表名,类型化的属性,而不是由字符串访问的所有对象

我们通过使用“添加新项”将数据集添加到我们的项目中来创建强类型数据表:

enter image description here

您可以忽略我所说的C#,这正是我为其他问题使用的项目。这两种语言是完全相同的。在您的VB项目的“数据”标题下查找您的

添加时会得到一个表面,右键单击它,然后Add >> DataTable。右键单击数据表,然后单击Add >> Column,为列提供名称和属性。在这里,通过学生和班级,我是通过链接数据库并将数据库表拖放到设计器上来生成它们的,所以我没有手动创建它们,但是可以。如果您正在使用数据库,请右键单击表面并添加>> TableAdapter,配置连接和查询,然后将获得一个模拟数据库表的数据表。如果您没有数据库,则只需手动创建表和列-我是使用“ NotFromDb”表完成的;为此,我要单击并添加DataTable / Columns。即使您没有数据库并且“手动”创建数据表,它仍然比编写Dim dt as new DataTabledt.Columns.Add("Age", ...)等语句的速度更快,更容易并且更好

所以您最终将得到如下所示的内容:

enter image description here

就是这样;您的强类型数据表已准备就绪!与常规数据表相比,它们要好得多。例如,要递增NotfromDB中的所有BlahInt,代码应类似于:

For Each r in notFromDb
  r.BlahInt += 1
Next r

弱类型数据表中的情况相同:

For Each r as DataRow in notFromDb.Rows
  r("BlhaInt") = DirectCast(r("BlahInt"), Integer) + 1
Next r

您可以看到我在BlhaInt中打了一个错字,并且Intellisense不会帮我,因为它是字符串,而不是完整的属性名。代码也很难读,因为所有内容都是对象,通过字符串访问,并且必须进行强制转换以使其有用

总的说来,简单易用的数据表很麻烦,我很少使用它们,因为强类型的数据表很容易创建并且使用起来更方便


现在,关于动态的要点:

我的数据库中有这些值(这是:

enter image description here

这只是测试数据,但给了我们一些帮助。我们将对ClassID> 5

进行动态处理

这是我的VS在执行动态代码后在调试器中停止的镜头:

enter image description here

C#中的

this与VB中的me相同。如前所述,这就是C#,因为这就是我所处的位置。看一下schoolDB.Where,它与VB中的相同。 schoolDS是我的Students强类型数据表所在的数据集,因此数据表名称前的schoolDS.

我已将运算结果分配给dt变量,C#var就像VB的Dim

所以您可以看到..它确实有效,并且比使用弱类型的数据表和拥有所有AsEnumerable AsQueryable等更简单,更干净

答案 2 :(得分:-1)

欢迎堆栈溢出!!!

尝试以下几点:

Include System.Linq.Dynamic

where

select

query

相关问题