【问题标题】:Full outer join - Linq To SQL全外连接 - Linq To SQL
【发布时间】:2011-01-30 11:48:16
【问题描述】:

我正在尝试使用 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 有一行,但它是空的。

【问题讨论】:

    标签: linq-to-sql join


    【解决方案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 };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-25
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2010-09-21
      • 2013-06-13
      相关资源
      最近更新 更多