Datatable联合查询

X-i-n 2015-04-14 04:42:38
碰到一个关于datatable联合查询的问题,需要根据datatable1 和 datatable2 (图中的原表1,原表2)进行查询,查出完整的结果(按datatable1进行左外联接查询,或者全外联接查询也可以),本来想用循环来实现,但是效率会比较低,就打算用LINQ实现,但是写来写去只写出来内联接的查询。请教一下应该如何实现左连接呢?
主键=id1 & id2

Public Class Form1

Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
Dim dt1 As New DataTable, dt2 As New DataTable
With dt1.Columns
.Add("id1", GetType(String))
.Add("id2", GetType(String))
.Add("value1", GetType(Double))
End With
With dt2.Columns
.Add("id1", GetType(String))
.Add("id2", GetType(String))
.Add("value2", GetType(Integer))
End With
With dt1.Rows
.Add("p1", "c1", 111)
.Add("p2", "c2", 222)
.Add("p3", "c3", 333)
.Add("p4", "c4", 444)
.Add("p5", "c5", 555)
End With
With dt2.Rows
.Add("p1", "c1", 1)
.Add("p3", "c3", 2)
End With
Dim linqquery =
From t1 In dt1
Join t2 In dt2
On t1.Field(Of String)("id1") Equals t2.Field(Of String)("id1") And
t1.Field(Of String)("id2") Equals t2.Field(Of String)("id2")
Select t1.ItemArray.Concat(t2.ItemArray.Skip(2))

dgv1.DataSource = dt1
dgv2.DataSource = dt2
'dgv3.DataSource = linqquery
With dgv3.Columns
.Add("col1", "campaign")
.Add("col2", "content")
.Add("col5", "value1")
.Add("col6", "value2")
End With
For Each obj In linqquery
dgv3.Rows.Add(obj.ToArray)
Next
End Sub
End Class

...全文
322 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
X-i-n 2015-04-14
  • 打赏
  • 举报
回复
因为对linq的原理不清楚,所以才会有这种观念。谢谢指点
X-i-n 2015-04-14
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
要Group Join


下了LINQ示例,搞定了,多谢

        Dim linqquery =
From t1 In dt1 Group Join t2 In dt2
On t1!id1 Equals t2!id1 And t1!id2 Equals t2!id2 Into Group
From t3 In Group.DefaultIfEmpty()
Select t1!id1, t1!id2, t1!value1, v2 = If(t3 Is Nothing, 0, t3!value2)


於黾 2015-04-14
  • 打赏
  • 举报
回复
本来想用循环来实现,但是效率会比较低 LINQ里也不过是使用的循环 只不过语法上看起来简洁了而已,效率上只会更低,因为要申请一大堆资源 当然,为了语法上简洁100倍,效率下降1%是值得的. 但是单纯的为了提高效率而改用LINQ,就是缘木求鱼了吧
  • 打赏
  • 举报
回复
要Group Join
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390696579 写法不一样,你看上面链接2楼的帖子
X-i-n 2015-04-14
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
Into吧,我看你前面的都大写了
我用的是 vb.net ,大小写不敏感,如果有这个关键词,它会自动更正。会不会是需要其它引用呢?或者语法不一样?
  • 打赏
  • 举报
回复
Into吧,我看你前面的都大写了
X-i-n 2015-04-14
  • 打赏
  • 举报
回复
是不是vb.net的语法不一样呢?或者我需要添加一些额外的引用?这种写法我之前试过,没有into这个关键字
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_46e9573c01014fx2.html
From t1 In dt1
            Join t2 In dt2
            On t1.Field(Of String)("id1") Equals t2.Field(Of String)("id1") And
            t1.Field(Of String)("id2") Equals t2.Field(Of String)("id2") into g
           from t2  in g.DefaultIfEmpty()
...

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧