2011-01-30 5 views
3

전 Linq를 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 };