LINQ에서 SQL에서 또는 조항으로 두 테이블에 가입하십시오.
-
13-09-2019 - |
문제
계획과 문서가 있다고 가정 해 봅시다
Dim myPlans = _context.Plans.Where(predicate1)
Dim myDocuments = _context.Documents.Where(predicate2)
나는 술어 빌더를 사용하여 각각의 where 절을 구성했습니다. 따라서 MyPlans 및 MyDocuments에는 올바른 SQL 문이 있습니다.
내가하고 싶은 것은이 두 테이블을 하나의 LINQ 문에 가입하는 것입니다. 내가 가진 문제는 기본적으로 조건이 클로스에 가입한다는 것입니다.
myplans where clause : (p.name like "%test%"및 p.name과 같은 "%bed%") 또는 (p.description과 같은 "%test%"및 p.description과 같은 "%bed%")
MyDocuments Where 절 : (D.Name Like "%test%"및 D.Name Like "%bed%") 또는 ( "%test%"와 같은 d.description 및 "%bed%"와 같은 d.description))
내가 둘을 결합 할 때 원한다 조항이있는 결과 :
여기서 (d.id = p.id) 및 (위의 조항에 myplans) 또는 (위의 조항 인 MyDocument). 즉, 각 테이블의 조항이 "또는"대신 "및"대신 "이기를 원합니다.
조항이있는 현재 결과 : 여기서 (d.id = p.id) 및 (위의 조항). 그리고 (위의 조항 인 MyDocument). 즉, 각 테이블의 조항이 "또는"대신 "및"대신 "이기를 원합니다.
나는 다음과 같은 진술을 형성하고있다 :
Dim test = From d in myDocuments _
Join p in MyPlans on d.ID Equals p.ID _
Select d.Name, p.Name
해결책
원하는 결과를 얻으려면 술어 필터링을 수행하고 단일 문장에 조인해야합니다.
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
다른 팁
이것은 당신이 당신의 predicates와 일치하는 계획과 문서를 필터링하는 "첫 번째 패스"를하고 있기 때문에 그 다음에 그 결과 만 합류하고 효과적으로 수행합니다 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