:
예를 들어 다음
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
이 결과 유형을 변경하지 않는다는 것입니다. query
은 T
의 경우 IQueryable<T>
이고 Where
이후이므로이 쿼리를 다시 query
에 할당 할 수 있습니다.
조인 경우
다음 값을 추가하는 것입니다
other_table.OtherField
및
ot.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
는 -1
condition1
경우로 설정되는 정수입니다 YetAnotherField
은이 거짓 인 경우 null
으로 설정된 문자열입니다.
동적 나는 데이터베이스 수준 및 쿼리에서 적절한 뷰를 작성하는 것이 좋습니다 그것을 – Konstantin
를 조립하는 것을 시도에 반대하는 것처럼, 조건에 따라 2 개 개의 다른 쿼리를 구성하는 것을 고려했다가 그것을 통해 LINQ. –
다른 모든 테이블에 왼쪽 조인을 한 다음 작업 할 수 있습니다. –