2016-06-15 2 views
1

나는 세 가지 조건Expression.And 세 가지 조건

그러나 Linq.Expressions.Expression.And는 두 표현식을 취할 수와 식을 만들려고합니다.

내가하고 싶은 : expression1 및 Expression2 위 expression3은

방법이 할 Linq.Expressions에 직접 있습니까?

답변

1

/둥지를 :

C#에서
Expression.And(
    Expression.And(
    ..., 
    ... 
), 
    ... 
); 
+0

C#의 모든 이진 연산자는 왼쪽 연관이므로 And (x, And (y, z)) 대신'And (And (x, y), z)'를 사용합니다. – Heinzi

+0

'And (x, y), z '와'And (x, And (y, z))의 차이점은 무엇입니까? –

+0

@ Azerty123 :이 특별한 경우, 이진 AND는 단락을 일으키지 않는 연관 연산이기 때문에 효과가있다. – Heinzi

0

사용 And 두 번

즉, (의사 코드),

당신은 결합해야
And(condition1,And(condition1,condition2)) 
1

&는 이항 연산자이며, 표현 머릿단 거울 C#.

그래서, 왼쪽 연관되어있는 C#을 표현 a & b & c은 정말 (a & b) & c 및 사용하여 식 트리 의미

Expresssion.And(Expression.And(a, b), c) 

주 당신은 또한 && 운영자에 대한 식 트리를 만드는 것을 의미하는 경우 단락이있는 경우 AndAlso을 사용해야합니다.

사이드 노트 : 표현식 트리를 만드는 방법을 배우는 가장 쉬운 방법은 C# 컴파일러 자체를 사용하는 것입니다. 예를 들어, 바로이 코드 조각 컴파일 :

Expression<Func<bool>> e =() => a & b & c; 

를 (예 : ILSpy 등) 디 컴파일러 도구의 결과 어셈블리를 검사합니다. 표현식 트리를 구문 분석하는 모든 최적화를 코드로 되돌려 놓으십시오.

-1

제공된 답변을 통해 문제를 해결할 수 있지만 더 좋은 질문이 있습니다. 의 조건을 어떻게 적용합니까?

Aggregate 메서드를 사용하면 데이터 집합에 일련의 조건을 적용 할 수 있습니다. 예 :

//values to filter 
var values = new int[] { 1, 10, 46, 51, 58, 92, 105, 110 }.AsQueryable(); 
var filters = new Expression<Func<int, bool>>[] { 
    i => i % 2 == 0, // integer is even 
    i => i > 50,  // integer is greater than 50 
    i => i < 100  // integer is less than 100 
}; 
var result = filters.Aggregate(values, (current, expression) => current.Where(expression)); 
//result is { 58, 92 } 

이 값의 집합에 여러 필터를 적용 다루는 대부분의 상황에 우아한 솔루션입니다.

+0

downvotes 이유, 누구? – Daniel