首页 > 解决方案 > 通过动态 LINQ 查询数据表

问题描述

我有一个 DataTable,喜欢通过动态 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 定义二元运算符 GreaterThan”

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

标签: vb.netlinqdatatable

解决方案


正如评论中提到的,如果您使用强类型数据表,它会让您的生活变得更加美好。这些是由设计者生成的数据表,具有命名、类型化的属性,而不是一切都是对象,通过字符串访问

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

在此处输入图像描述

你可以忽略我说的 C#——这正是我正在为其他一些 qustion 工作的项目所使用的。这两种语言在底层是相同的。在您的 VB 项目的数据标题下查找您的

当你添加它时,你会得到一个表面,右键单击它并Add >> DataTable. 右键单击数据Add >> Column表,然后给出列名称和属性。对于学生和班级,我通过链接数据库并将数据库表放到设计器中来生成它们,所以我没有手动创建它们,但你可以。如果您正在使用数据库,请右键单击表面并添加 >> TableAdapter,配置连接和查询,您将获得一个模仿您的数据库表的数据表。如果您没有数据库,只需手动创建表和列 - 我是使用“NotFromDb”表完成的;对于那个我点击并添加数据表/列。即使您没有数据库并且“手动”创建数据表,它仍然会更快,Dim dt as new DataTabledt.Columns.Add("Age", ...)等_

所以你最终会得到这样的东西:

在此处输入图像描述

而已; 您的强类型数据表已准备就绪!与常规数据表相比,它们更易于使用。例如,要递增 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 不会帮助我,因为它是一个字符串,而不是一个完整的属性名称。代码也更难阅读,因为一切都是一个对象,由一个字符串并且必须被强制转换以使其有用

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


现在,关于动态的要点:

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

在此处输入图像描述

这只是测试数据,但给了我们一些可以使用的东西。我们将为 ClassID > 5 做一个动态处理

这是执行动态后我的 VS 在调试器中停止的照片:

在此处输入图像描述

this在 C# 中与me在 VB 中相同。如前所述,这是 C#,因为它是我周围的东西;看看schoolDB.Where它与 VB 中的相同。schoolDS是我的Students强类型数据表所在的数据集,因此在数据schoolDS.表名称之前

我已经将操作的结果赋给了dt变量,C#var就像VB的Dim

所以你可以看到.. 它只是工作,它比使用弱类型数据表和拥有所有 AsEnumerable AsQueryable blah 更简单、更干净


推荐阅读