2009-02-03 1 views
3

LinqDataSource 개체에 필터를 적용 할 수있는 웹 사용자 지정 컨트롤을 개발 중입니다. 그것은 특정 유형의 객체로 작동해야하기 때문에 일반적인 제어입니다.컴파일 타임에 개체 유형을 알 수 없을 때 LINQ 쿼리를 작성하는 방법

컨트롤은 필드를 따라 작동해야 객체의 내용 필드에 알고

/// <summary> 
    /// Method to get compared column from object 
    /// </summary> 
    public Expression<Func<T, int>> GetColumnMethod; 

우리는 같은 코드로 필터링을 수행

(나는 그것을 개체 유형에서 해당 필드를 얻는 방법을 전송)

... if (selectedValue == "< =") 술어 = 술어. 그리고 (c => 방법 (c) < = val); if (selectedValue == "<") 술어 = 술어. 그리고 (c => 방법 (c) < 발);

모두 LINQ to SQL 변환이 발생할 때까지 계속 진행됩니다. 는 그런 오류 "방법은 '.....'SQL에 지원되는 변환이 없습니다.

확인, CLR은 명 규모의 SQL을 만드는 방법을 알고하지 않습니다. 단지 C#을 번역하기 전에 식을 컴파일 할 수

경우 SQL에,하지만 난 그것을 할 수 있도록하는 방법을 몰라 (나는 하루 종일 시도 까다로운 어떤 방법 - 나는 이미 모든 ... 아무것도 도움이되지 그들을 기억할 수) Expression.Compile 같은

타락.

하지만 ... 런타임에 CLR은 이미 내 개체의 형식을 알고 있으므로 SQL 식을 구축 할 수 있습니다. compile 된 델리게이트 값. 그러나 그것을하는 방법? 신은 알고 계십니다.

도움 감사합니다.

답변

3

LINQ to SQL 공급자는 식 트리를 유효한 T-SQL 문으로 변환합니다. C#과 T-SQL 간의 1 대 1 관계가 없으므로 식 트리가 정교해질수록 LINQ to SQL이 번역 할 가능성이 적습니다.

람다 식을 사용할 때 컴파일 할 것인지 또는 표현식 트리로 사용할 것인지 결정해야합니다. 람다를 표현식으로 사용하려면 표현식에 공급자가 지원하는 함수와 구문이 포함되도록해야합니다.

0

가 조회에서 사용하는 특정 필드를 선택의 문제라면, 당신은 Expression.Compile "왜곡"을 사용하여이 작업을 수행 할 수 있어야한다 . 그러나 그것은 많은 일이 될 것 같습니다. 아마도 지금 가지고있는 것을 컴파일하고 출력에 대해 Reflector를 사용하여 C# 컴파일러에서 생성 된 코드가 어떻게 보이는지 확인할 수 있습니다.

쿼리를 두 부분으로 나눌 수 있습니다. 하나는 SQL로 변환되어 서버에서 실행되고 다른 하나는 GetColumnMethod를 사용하고 첫 번째 부분의 데이터 출력에 대해 메모리에서 실행되는 부분입니다.

0

임의의 대리인을위한 SQL이 없습니다. method(c)을 람다로 표현할 수 있다면 Expression.Invoke을 사용하여 람다를 하위 표현식으로 호출 할 수 있지만 직접 표현식 트리를 만들어야합니다 (like so).

관련 문제