全外连接 - Linq To SQL

3

我正在尝试使用Linq to SQL来进行全外连接。我已经成功地使用基本示例完成了这项工作,但当每个全外连接的一侧都是由另一个内部连接生成时,它却无法正常工作。下面是代码。我意识到这可能可以放入更少的查询中,但我宁愿将它们拆分成尽可能易读的部分。在这种情况下,性能不是问题。

var productIds = db.OrderItemsIncoming.Select(i => i.ProductID)
    .Union(db.OrderItemsOutgoing.Select(o => o.ProductID))
    .Distinct();

var ordersIn =  from o in db.OrdersIncoming
                join i in db.OrderItemsIncoming on o.OrderNumber equals i.OrderNumber
                select new { o, i };

var ordersOut = from o in db.OrdersOutgoing
                join i in db.OrderItemsOutgoing on o.OrderNumber equals i.OrderNumber
                select new { o, i };

var fullOuterJoinResults =  from i in ordersIn
                            join o in ordersOut on i.i.ProductID equals o.i.ProductID into t
                            from o in t.DefaultIfEmpty()
                            where i == null ^ o == null
                            select new { i, o };

在我的测试中,ordersIn结果为空,而ordersOut结果中有一行。因此,我希望最终的fullOuterJoinResults能够有一行,但是它是空的。
1个回答

1

我刚发布完就发现一个错误,我没有在任何地方使用productID结果!!! :-/ 一旦我解决了这个问题,我会编辑这篇文章并分享我的解决方法...

[编辑]

好的,看起来这个方法可行:

var ordersIn =  from o in db.OrdersIncoming
                join i in db.OrderItemsIncoming on o.OrderNumber equals i.OrderNumber
                select new { o, i };

var ordersOut = from o in db.OrdersOutgoing
                join i in db.OrderItemsOutgoing on o.OrderNumber equals i.OrderNumber
                select new { o, i };

var productIds = db.OrderItemsIncoming.Select(i => i.ProductID)
    .Union(db.OrderItemsOutgoing.Select(o => o.ProductID))
    .Distinct();

var fullOuterJoinResults =    from pid in productIDs
                        join i in ordersIn on pid equals i.i.ProductID into t1
                        from i in t1.DefaultIfEmpty()
                        join o in ordersOut on pid equals o.i.ProductID into t2
                        from o in t2.DefaultIfEmpty()
                        where i == null ^ o == null
                        select new { i, o };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接