2011-01-30 5 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 }; 
Смежные вопросы