左外连接两个数据表-VB.NET

时间:2019-10-10 23:22:46

标签: sql-server vb.net linq

如何使用linq连接两个数据表。我想退回所有带有取消状态标志的订单。

订单表

    ItemNum OrderNum
1   Item1   101
2   Item2   102

订单日志表

    ItemNum OrderNum    IsCanceled
1   Item2   102         1

最终结果

    OrderNum    ItemNum  IsCanceled
1   101         Item1    0
2   102         Item2    1

这是演示;

https://rextester.com/RQQZJ4470

到目前为止,我还没有尝试过这种方法;

 Dim result = From b In backOrders.AsEnumerable()
                         Join c In backOrdersCanceledItems.AsEnumerable() On
                    c.Field(Of Integer)("DistNum") Equals b.Field(Of Integer)("DistNum") And c.Field(Of String)("OriginalOrderNum") Equals b.Field(Of String)("OriginalOrderNum")
                         Select New With {.OriginalOrderNum = b.Field(Of String)("OriginalOrderNum"),
                    .DistNum = b.Field(Of Integer)("DistNum"), .ItemNum = b.Field(Of String)("ItemNum"),
                    .IsCanceled = c.Field(Of String)("IsCanceled")}

1 个答案:

答案 0 :(得分:0)

当然,您只需要在LINQ中进行左联接:

Dim result = From b In backOrders.AsEnumerable()
             Group Join c In backOrdersCanceledItems.AsEnumerable() On
                c.Field(Of Integer)("DistNum") Equals b.Field(Of Integer)("DistNum") And c.Field(Of String)("OriginalOrderNum") Equals b.Field(Of String)("OriginalOrderNum") Into cj = Group
             From c In cj.DefaultIfEmpty
             Select New With {
                .OriginalOrderNum = b.Field(Of String)("OriginalOrderNum"),
                .DistNum = b.Field(Of Integer)("DistNum"),
                .ItemNum = b.Field(Of String)("ItemNum"),
                .IsCanceled = If(c?.Field(Of String)("IsCanceled"), "0") }

有关C#版本,请参见我的SQL to LINQ Recipe