2011-01-30 107 views
3

我正在尝试使用Linq to SQL来完成一个完整的外连接。我曾经为一个基本的例子工作,但是当完整的外部联接的每一边都是从另一个内部联接生成的时候,它不起作用。下面的代码。我意识到这可能会减少查询 - 但我宁愿将它们分开以使它们尽可能易读。在这种情况下,性能不是问题。完全外连接 - 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

在我发布信息后,我注意到一个错误,我没有在任何地方使用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 };