我有一个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“
好的,我在某种程度上理解了错误消息,但是我不知道该如何相应地更改代码。
答案 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)
如评论中所述,如果使用强类型的数据表,它将使您的生活大大增加。这些是由设计人员生成的数据表,具有表名,类型化的属性,而不是由字符串访问的所有对象
我们通过使用“添加新项”将数据集添加到我们的项目中来创建强类型数据表:
您可以忽略我所说的C#,这正是我为其他问题使用的项目。这两种语言是完全相同的。在您的VB项目的“数据”标题下查找您的
添加时会得到一个表面,右键单击它,然后Add >> DataTable
。右键单击数据表,然后单击Add >> Column
,为列提供名称和属性。在这里,通过学生和班级,我是通过链接数据库并将数据库表拖放到设计器上来生成它们的,所以我没有手动创建它们,但是可以。如果您正在使用数据库,请右键单击表面并添加>> TableAdapter,配置连接和查询,然后将获得一个模拟数据库表的数据表。如果您没有数据库,则只需手动创建表和列-我是使用“ NotFromDb”表完成的;为此,我要单击并添加DataTable / Columns。即使您没有数据库并且“手动”创建数据表,它仍然比编写Dim dt as new DataTable
,dt.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在执行动态代码后在调试器中停止的镜头:
C#中的 this
与VB中的me
相同。如前所述,这就是C#,因为这就是我所处的位置。看一下schoolDB.Where
,它与VB中的相同。 schoolDS
是我的Students
强类型数据表所在的数据集,因此数据表名称前的schoolDS.
我已将运算结果分配给dt
变量,C#var
就像VB的Dim
所以您可以看到..它确实有效,并且比使用弱类型的数据表和拥有所有AsEnumerable AsQueryable等更简单,更干净
答案 2 :(得分:-1)