0

나는 다 대다 관계로 제품 (p)과 재료 (m) 및 제품 2 재료 테이블 (p2m)의 다 대다 관계를 가지고 있습니다. 링크.LINQ 엔터티 프레임 워크를 사용하는 다 대다에서 전체 외부 조인

나는 기본적으로

- all products that have materials assigned, 
- all products with no materials assigned, 
- and all materials with no products assigned. 

가 어떤 조합을 얻을 필요가있다. 그러나 데이터 필터가 될 것이므로 검색 기준과 일치하지 않는 제품 및/또는 자료 (예 : 'A'로 시작하는 모든 제품 등)를 필터링해야합니다.

LINQ-to-EF 4.1에서 어떻게합니까?

감사합니다.

+0

하고, 완전 외부 LINQ에서 조인 이후 두통 것 같다을 , 나는 LINQ 쿼리를 실행할보기에 대해 생각하고 있습니다. 보기에는 필요한 조인 (JOINS)이 이미 있습니다. LINQ 쿼리는 훨씬 쉬워집니다. – John

답변

0

Linq는 완전 외부 조인 작업을 직접 제공하지 않으므로 왼쪽 및 오른쪽 조인 L2E 쿼리를 분리하여 단일 결과 집합으로 결합하는 것이 가장 좋습니다.

내가 좋아하는 뭔가 (하지 테스트)를 시도 할 것입니다 :

var query = (from p in context.Products 
      from m in p.Materials 
      select new { p, m }) 
      .Union(
      from m in context.Materials 
      from p in m.Products 
      select new { p, m }) 
      ... 

이 아마도 당신이 외부 조인 적용 할 DefaultIfEmpty을 사용해야합니다.

수행하면 예하는 필드한다면 당신이 필요로하는 (하나 된 IQueryable로 필요

  1. 모든 제품
  2. 모든 사용하지 않는 재료 :

0

는 당신의 설명에서 당신이 실제로 필요한 것 같습니다) 또는 2 IQueryables로?

+0

음, 사용자가 원하는 것에 따라 모든 제품, 예, 모든 재료가 정말로 필요합니다. 사용자는 특별히 제품과 관련된 자료 또는 아직 연관되지 않은 자료를 원하는지 선택할 수 있습니다. – John

0

다음은 작업해야 할 다음 성능을

from m in context.Materials //m has to be the first 
from p in context.Products  
where !p.Select(p1 => p1.Material).Contains(m) || p.Material == null || p.Material == m 

은 아마 다음과 같은 더 나은 것 :이 시점에서

var a = from p in context.Products select p.Material; 

var b = from m in context.Materials //m has to be the first 
     from p in context.Products  
     where a.Contains(m) || p.Material == null || p.Material == m