문제

계획과 문서가 있다고 가정 해 봅시다

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top