2009-04-23 2 views
5

는이 전 각 사용 PredicateBuilder에 대한 where 절을 구조화 한 내가 계획 및 문서SQL에 LINQ와 함께 두 개의 테이블을 조인 또는 절

Dim myPlans = _context.Plans.Where(predicate1) 
Dim myDocuments = _context.Documents.Where(predicate2) 

있다고 가정 해 봅시다. 따라서 myPlans 및 myDocuments에는 올바른 SQL 문이 있습니다.

내가하고 싶은 것은이 두 테이블을 하나의 linq 문으로 결합하는 것입니다. 문제는 기본적으로 AND 조건이 where 절에 합류한다는 것입니다.

myPlans Where 절 : ("% test %"와 같은 p.name 및 "% bed %"와 같은 p.name) 또는 "% test %"와 같은 p.description과 "% bed %"와 같은 p.description)

myDocuments Where 절 : "% test %"와 같은 dname 및 "% bed %"와 같은 d.name) 또는 "% test %"와 같은 d.description과 "% bed % ") 조항은 어디에서이 두 원하는 결과를 결합

:
(d.ID = p.ID) 및 (myplans where 절 이상) 또는 (mydocument where 절 이상). 의미, 나는 각각의 테이블에있는 절이 "and"대신에 "or"가되도록 두 곳을 원합니다.

절은 현재 결과

: (d.ID = p.ID) AND (myplans WHERE 절 이상) AND (mydocument WHERE 절 이상). 의미, 나는 각각의 테이블에있는 절이 "and"대신에 "or"가되도록 두 곳을 원합니다.

나는 다음과 같은 문장을 형성하고 있습니다 : 원하는 결과를 달성하기 위해

Dim test = From d in myDocuments _ 
      Join p in MyPlans on d.ID Equals p.ID _ 
      Select d.Name, p.Name 

답변

3

, 당신은 술어 filterings을 할 필요가 단일 문에 조인.

Dim myCriteria() = {"test", "bed"} 
Dim test = from d in _context.Documents _ 
      join p in _context.Plans on d.ID Equals p.ID _ 
      where (myCriteria.Contains(d.Name) OR _ 
        myCriteria.Contains(d.Descrition)) _ 
      OR (myCriteria.Contains(p.Name) OR _ 
       myCriteria.Contains(p.Description)) _ 
      select Document = d.Name, Plan = p.Name 
2

당신이 당신의 조건에 맞는 계획과 문서를 필터링하는 "첫 번째 패스"를하고 있기 때문에 이런 일이, 그리고 효과적으로 AND을하고, 결과만을 결합 다음. 바실리오 (Basilio)가 말했듯이, 같은 패스에서 조인/필터를해야합니다. 당신은 이런 식으로 뭔가를 시도 할 수 있습니다 : 유사

Dim test = From d in _context.Documents _ 
      Join p in _context.Plans on d.ID Equals p.ID _ 
      Where predicate1(p) Or predicate2(d) 
      Select d.Name, p.Name 

또는를 :

Dim test = From d in _context.Documents _ 
      From p in _context.Plans _ 
      Where d.ID = p.ID And (predicate1(p) Or predicate2(d)) 
      Select d.Name, p.Name 
+0

나도 답변을 좋아합니다. +1 –