【发布时间】:2018-05-15 13:42:05
【问题描述】:
我想加入两个数据表并根据结果创建第三个。结果 DataTable 应该有三列:
- 身份证
- 姓名
- 出生年份
我的编译选项:
- 选项显式:打开
- 选项严格:开启
- 选项比较:二进制
-
选项推断:关闭
Dim dr As DataRow REM Dt1 Dim Dt1 As New DataTable Dt1.Columns.Add("ID", GetType(Integer)) Dt1.Columns.Add("Name", GetType(String)) dr = Dt1.NewRow dr("ID") = 1 dr("Name") = "Peter" Dt1.Rows.Add(dr) dr = Dt1.NewRow dr("ID") = 2 dr("Name") = "Anna" Dt1.Rows.Add(dr) dr = Dt1.NewRow dr("ID") = 3 dr("Name") = "John" Dt1.Rows.Add(dr) REM End Dt1 REM Dt2 Dim Dt2 As New DataTable Dt2.Columns.Add("ID", GetType(Integer)) Dt2.Columns.Add("YearOfBirth", GetType(Integer)) dr = Dt2.NewRow dr("ID") = 1 dr("YearOfBirth") = 1970 Dt2.Rows.Add(dr) dr = Dt2.NewRow dr("ID") = 2 dr("YearOfBirth") = 1980 Dt2.Rows.Add(dr) REM End Dt2 Dim Dt3 As New DataTable Dim query As IEnumerable(Of DataRow) = From dr1 In Dt1.AsEnumerable() Group Join dr2 In Dt2.AsEnumerable() On dr1.Field(Of Integer)("ID") Equals dr2.Field(Of Integer)("ID") Into joined = Group From j In joined.DefaultIfEmpty() Select New With { .ID = dr1.Field(Of Integer)("ID"), .Name = dr1.Field(Of String)("Name"), .YearOfBirth = j.Field(Of Integer)("YearOfBirth") } Dt3 = query.CopyToDataTable
但我在编辑器中收到错误消息(VS 2017):
“错误 BC36754: “IEnumerable(匿名类型:ID 作为整数,名称作为字符串,YearOfBirth 作为整数)”无法转换为“IEnumerable(数据行)”,因为“匿名类型:ID 作为整数,名称作为字符串,YearOfBirth 作为整数”不是从 'DataRow' 派生,根据 'Interface IEnumerable(Of Out T)' 中的 'Out' 泛型参数 'T' 的要求。”
【问题讨论】:
-
您不能致电
CopyToDataTable,除非您的列表包含DataRows,而您的列表中没有。您需要自己创建DataTable,然后遍历查询结果,为每个项目添加DataRow。 -
谢谢,我的查询有误。
-
如果有人可以为我编写正确的部分代码(Dim 查询...),那对我很有帮助。