2013-07-12 3 views
2

내가 엔티티 프레임 워크 코드에 꽤 표준 검색 기능을 구현하는 저장 프로 시저를 변환하고, 그리고 SQL의 비트가 무엇을하고 있는지 수행하는 방법을 아주 확실하지 않다 : 그래서EF 조건부 가입 또는

SELECT 
    *  
FROM 
    MyTable a 
WHERE 
    @parameter1 = 0 OR a.Id IN 
     (
      SELECT ot.Id FROM OtherTable ot 
      WHERE ot.Id = @parameter1 
      AND (@parameter2 = 0 OR ot.OtherValue = @parameter2) 
     ) 

기본적으로 일부 선택적 검색 매개 변수가 전달되며 0이 아닌 경우 필터로 사용됩니다. 꽤 표준.

위의 경우 M : 1 관계가 있고, "많은"쪽에 OtherTable이 있습니다.

나는 두 가지 옵션을 참조하지만 난에 대한 올바른 구문을 얻을 수없는 것 중 하나

(1) 나는 조건부로 SP에서 수행되고 있는지 시뮬레이션 할 수있는 곳 절 (Example Here). 나는 이와 같은 것을 시도했다 :

.WhereIf(search.Id != 0, mytable => search.AttributeId == mytable.OtherTables) 

이것은 @ parameter2를 위해 더 필터링되어야 할 것이다. 그러나 어떤 경우에는 mytable.OtherTables는 "많은"측면에 있으므로 컬렉션이므로 mytable.OtherTables.Id와 같이 사용할 수 없습니다.

(2) 이것을 조인으로 변환 할 수 있지만 조인은 조건부이어야합니다 (@ parameter1! = 0 인 경우 조인 만 포함해야 함). 조건부 합류가 L2S/EF와 가능한지 확실하지 않습니다.

답변

2

조건부로 Where을 추가하고 모든 것을 SQL로 보내고 복잡한 쿼리를 작성하는 대신 SQL에 관련 비트를 보내는 방법은 어떻습니까?

Linq는 지연된 실행을 사용하여 쿼리를 한 장씩 작성한 다음 준비가되었을 때 실행하도록합니다.

IQueryable<MyTable> myTableQuery = context.MyTables.AsQueryable(); 

if (parameter1 != 0) 
{ 
    IQueryable<OtherTable> otherTableQuery = context.OtherTables.AsQueryable(); 

    if (parameter2 != 0) 
    { 
     otherTableQuery = otherTableQuery.Where(ot => OtherValue = parameter2); 
    } 

    myTableQuery = myTableQuery.Where(mt => otherTableQuery.Any(ot => ot.Id = mt.Id)); 
} 

return myTableQuery.ToList(); 

브라우저에서 구성된 모든 오타를 용서하십시오.