카테고리 없음

[씨#] 식에 다른 조건을 추가하는 방법은 무엇입니까?

행복을전해요 2021. 1. 29. 10:24

간단하게 :

Expression<Func<int, bool>> exp = i => i < 15 && i > 10;
var compiled = exp.Compile();
exp = i => compiled(i) && i % 2 == 0;  //example additional condition

다음과 같이 할 수 없습니다.

exp = i => exp.Compile()(i) && i % 2 == 0; //example additional condition

이므로 exp그것이 발생할 호출 참조 결과적으로 폐쇄에 추가 될 것이다 StackOverflowException.

-------------------

두 가지 옵션이 있습니다. 첫 번째는 BartoszKP 버전으로, 첫 번째 표현을 블랙 박스하고 나중에 사용합니다. 그러나 이것은 훌륭한 구문 지원을 제공하지만 Entity Framework와 같은 시스템은 블랙 박스이기 때문에 실제로 표현식을 사용할 수 없음을 의미합니다. 이식이 데이터베이스 쿼리에 사용 된 경우 EF는 서버에서이 조건자를 확인할 수 없지만 작동하는 경우 모든 데이터를 클라이언트로 검색해야합니다.

따라서 데이터베이스 쿼리와 같은 표현식을 사용하려면 표현식 API를 사용해야합니다.

Expression<Func<int, bool>> exp = i => i<15 && i>10;
exp = Expression.Lambda<Func<int, bool>>(Expression.AndAlso(exp.Body, ...), exp.Parameters[0]);

세 개의 점은 두 번째 부분으로 삽입하려는 표현식을 나타냅니다. 컴파일러에서 만든 다른 식을 사용할 수 있지만 그런 다음 매개 변수를 바꿔야합니다.



출처
https://stackoverflow.com/questions/22039823