2013-12-11 1 views
0

다음 LINQ 쿼리가 작성되었지만 .. . .쓰기 LINQ가 다중 조건을 결합하는 방법

세 번째 가입 인 경우 ...이 경우 condional ... 어떻게 작성 하시겠습니까? 같은, 다음, 가장 쉬운 방법은이 작업을 수행하는 other_tableother_table2의 유형이 될 경우

var query = from trip in db.Trips 
from driver in db.Drivers 
condition1 ? join X in other_table : join Y in other_table2 
where trip.DriverId == driver.DriverId || 
     trip.CoDriverId == driver.DriverId 
select new { driver.DriverId, trip.TripId }; 
+0

동적 나는 데이터베이스 수준 및 쿼리에서 적절한 뷰를 작성하는 것이 좋습니다 그것을 – Konstantin

+0

를 조립하는 것을 시도에 반대하는 것처럼, 조건에 따라 2 개 개의 다른 쿼리를 구성하는 것을 고려했다가 그것을 통해 LINQ. –

+0

다른 모든 테이블에 왼쪽 조인을 한 다음 작업 할 수 있습니다. –

답변

2

:

예를 들어 다음

IQueryable<SomeType> joinTable = condition1 ? other_table : other_table2; 

그리고 당신의 쿼리의 일환으로 join j in joinTable를 사용 . 여기

if(condition1) 
    query = query.Where(q => other_table.Where(o => foo==bar).Select(o => o.DriverId).Contains(q.DriverId)); 
else 
    query = query.Where(q => other_table.Select(o => o.DriverId).Contains(q.DriverId)); 

제한 : 만 조인을 사용하는 경우

그렇지 않으면, 당신이 먼저를 무시하고 다음과 같은 무언가를 추가 할 query를 작성할 수, WHERE 조건을 제한하는 것이 아니라 필드에 영향을 미치는 foo==bar은 필요한 경우 추가로 Where 절에 세부 사항을 추가 할 수 있음을 보여줍니다. 중요한 것은 Where이 결과 유형을 변경하지 않는다는 것입니다. queryT의 경우 IQueryable<T>이고 Where 이후이므로이 쿼리를 다시 query에 할당 할 수 있습니다.

조인 경우

다음 값을 추가하는 것입니다 other_table.OtherFieldot.YetAnotherField는 동일한 유형이어야한다는

var newQuery = condition1 
    ? query.Join(other_table, q=>DriverId, ot => ot.DriverId, (q, ot) => new {q.DriverID, q.TripId, ot.OtherField} 
    : query.Join(other_table2, q=>DriverId, ot => ot.DriverId, (q, ot) => new {q.DriverId, q.TripId, OtherField = ot.YetAnotherField}; 

참고. 이것은 컴파일러가 동일한 클래스와 동일한 이름, 순서 및 유형의 필드를 가진 익명 클래스를 생성하므로 newQuery의 유형을 추론 할 수 있으며 각 분기에 대해 동일합니다. 그들은 다음 같은 유형하지 않으면 당신도 다른 유형에 하나를 캐스팅해야하거나 다른 사람과 같이 수행이 마지막 예에서

var newQuery = condition1 
    ? query.Join(other_table, q=>DriverId, ot => ot.DriverId, (q, ot) => new {q.DriverID, q.TripId, ot.OtherField, YetAnotherField = (string)null} 
    : query.Join(other_table2, q=>DriverId, ot => ot.DriverId, (q, ot) => new {q.DriverId, q.TripId, OtherField = -1, ot.YetAnotherField}; 

OtherField-1condition1 경우로 설정되는 정수입니다 YetAnotherField은이 거짓 인 경우 null으로 설정된 문자열입니다.

0

그래서 핵심 질문, 이해하는 경우 :

var query = from trip in db.Trips 
      from driver in (condition1 ? cdb.Drivers1 : cdb.Drivers2) 
      where trip.DriverId == driver.DriverId || 
      trip.CoDriverId == driver.DriverId 
      select new { driver.DriverId, trip.TripId }; 
+0

두 소스가 같은 유형 인 경우 작동합니다. –

+0

사실입니다 (TypedDataSet을 사용하는 것 같습니다. 확실히 다른 유형 임) . 귀하의 대답은 정확합니다. 또 다른 제안 : 때때로 데이터베이스 수준 (DataAdapter의 경우)에서 UNION으로 테이블을 연결해야합니다. – dovid

관련 문제