나는 세 가지 조건Expression.And 세 가지 조건
그러나 Linq.Expressions.Expression.And는 두 표현식을 취할 수와 식을 만들려고합니다.
내가하고 싶은 : expression1 및 Expression2 위 expression3은
을방법이 할 Linq.Expressions에 직접 있습니까?
나는 세 가지 조건Expression.And 세 가지 조건
그러나 Linq.Expressions.Expression.And는 두 표현식을 취할 수와 식을 만들려고합니다.
내가하고 싶은 : expression1 및 Expression2 위 expression3은
을방법이 할 Linq.Expressions에 직접 있습니까?
/둥지를 :
C#에서Expression.And(
Expression.And(
...,
...
),
...
);
사용 And
두 번
즉, (의사 코드),
당신은 결합해야And(condition1,And(condition1,condition2))
이 &
는 이항 연산자이며, 표현 머릿단 거울 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 등) 디 컴파일러 도구의 결과 어셈블리를 검사합니다. 표현식 트리를 구문 분석하는 모든 최적화를 코드로 되돌려 놓으십시오.
제공된 답변을 통해 문제를 해결할 수 있지만 더 좋은 질문이 있습니다. 의 조건을 어떻게 적용합니까?
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 }
이 값의 집합에 여러 필터를 적용 다루는 대부분의 상황에 우아한 솔루션입니다.
downvotes 이유, 누구? – Daniel
C#의 모든 이진 연산자는 왼쪽 연관이므로 And (x, And (y, z)) 대신'And (And (x, y), z)'를 사용합니다. – Heinzi
'And (x, y), z '와'And (x, And (y, z))의 차이점은 무엇입니까? –
@ Azerty123 :이 특별한 경우, 이진 AND는 단락을 일으키지 않는 연관 연산이기 때문에 효과가있다. – Heinzi