2011-10-15 5 views
1

나는 람다 함수와 다중 선택을 람다 식으로 결합하려고합니다. 어떻게해야합니까? 마지막 줄이 잘못되었다는 것을 알고 있지만, 내가 무슨 뜻인지에 대한 아이디어를줍니다.람다 함수를 람다 식으로 변환하기

Func<Event, bool> where = null; 

if (!string.IsNullOrWhiteSpace(searchToken)) 
    where = q => q.Name.ToUpper().Contains(searchToken.ToUpper()); 

where += q => q.Hidden = false; 

Expression<Func<Event, bool>> where1 = q => where; <-- Erroring 
+1

당신이 정말로 목표로하고있는 것이 명확하지 않습니다. 여러 개의 필터를 수행하려고하십니까? 더 큰 그림은 무엇입니까? –

+0

큰 그림은 Expression >을 사용하는 일반 함수입니다. 추가 할 필요가있는 조건문이 있습니다. Func 을 사용하여 내 기준을 작성했지만이를 Expression >과 같이 일반 함수로 보내려고합니다. –

+0

표현식 작성기라는 것을 발견했지만 기본 방법이 있습니까? –

답변

4

고객님이 원하시는 것으로 의심됩니다 PredicateBuilder. (소스는 해당 페이지에서 사용할 수 있습니다.) 당신이처럼 사용하십시오 : 당신이 원하는 가정 것

var predicate = q => !q.Hidden; 
if (!string.IsNullOrWhiteSpace(searchToken)) 
{ 
    predicate = predicate.And(q => q.Name.ToUpper() 
             .Contains(searchToken.ToUpper()); 
} 
return predicate; 

은 "와"조건을합니다 - 당신은 분명 ...

주를 만든 적이 그 즉, 이 아닌은 대소 문자를 구분하지 않고 비교할 수있는 좋은 방법입니다. 검색어 (예 : LINQ to SQL, LINQ to EF)를 사용할 것인지 알려주면 대/소문자를 구분하지 않는 쿼리를 수행하는 공급자 호환 방법을 제안 할 수 있습니다.

+0

var predicate = q =>! q.Hidden이란 무엇입니까? 그게 Func의 표현인가요? –

+0

@MikeFlynn : 컴파일되지 않습니다. 람다 식을 암시 적으로 입력 된 변수에 할당 할 수 없습니다. 당신은'Expression > predicate = q =>! q.Hidden;'또는'Func predicate = q =>! q.Hidden;'중 하나를 가질 수 있습니다. 첫 번째는 표현 트리를, 후자는 델리게이트를 제공합니다. –

0

http://msdn.microsoft.com/en-us/library/bb882637.aspx을 살펴보십시오. 표현식 트리를 사용하여 동적 쿼리를 작성하는 방법

AFAIK 식> 식을 사용할 때 컴파일러가 AST 추상 구문 3을 작성하고 식 <> 인스턴스에 데이터로 저장하므로 컴파일 타임에 식을 알아야합니다.