우선 내가이 문제를 만들기 전에 다른 질문과 답변을 검색했음을 알리고 싶지만 내가 직면하고있는이 특정 문제에서 나를 도울 수있는 어떤 것도 찾지 못합니다.두 표현식 트리에서 일반 람다를 만드는 방법은 무엇입니까?
클래스의 두 속성을 기반으로 레지스터를 필터링해야하는데, 그 중 하나는 검색에 해당하는 필드이고 다른 하나는 데이터베이스에서 레지스터를 참조해야하는 다른 엔터티의 숫자 코드입니다.
내 검색 기능은 다음과 같은 서명이있다 :
public List<TView> SearchByField(int parentCode, string fieldName, string filter);
나는이 사용하는 표현의 나무를 구현하기 위해 노력하고, 두 식을 얻기 위해 그것을 가지고,하지만 지금은에 이러한 식을 결합하지 않았다했습니다 완성품에 전달하기 위해 하나 만들어라. 단 하나의 표현을 너무 섞을 것이다. 내가 지금까지 코드가 (긴 조각 미안하지만 난이 쉽게 질문을 이해할 수 있도록하는 것이 필요하다고 생각) 아래되었다있어 무엇
: 어떤 제안에 대한
public List<TView> SearchPerField(int parentCode, string fieldName, string filter)
{
var lambdaExpression = GetLambdaExpressionForSearchByField(fieldName, filter, parentCode);
return new PersistenciaImpl<TView>().Where(lambdaExpression).ToList();
}
private Expression<Func<TView, bool>> GetLambdaExpressionForSearchByField(string fieldName, string filter, int parentCode)
{
Expression<Func<TView, bool>> textFilterExpression = GetTextFilterExpression(fieldName, filter);
Expression<Func<TView, bool>> parentCodeFilterExpression = GetParentCodeFilterExpression(parentCode);
Expression.Lambda<Func<TView, bool>>(textFilterExpression, parentCodeFilterExpression);
// THIS IS THE POINT. HOW TO MAKE THIS WORK?
Expression.AndAlso(parentCodeFilterExpression, textFilterExpression);
return textFilterExpression;
}
private Expression<Func<TView, bool>> GetParentCodeFilterExpression(int parentCode)
{
ParameterExpression parameter = Expression.Parameter(typeof(TView), "x");
Expression parent = Expression.Property(parameter, "Parent");
Expression parentCodeExpression = Expression.Property(parent, "Code");
Expression target = Expression.Constant(parentCode);
Expression containsMethod = Expression.Call(parentCodeExpression, "Equals", null, target);
Expression<Func<TView, bool>> textFilterExpression =
Expression.Lambda<Func<TView, bool>>(containsMethod, parameter);
return textFilterExpression;
}
private Expression<Func<TView, bool>> GetTextFilterExpression(string fieldName, string filter)
{
ParameterExpression parameter = Expression.Parameter(typeof(TView), "x");
Expression property = Expression.Property(parameter, fieldName);
Expression target = Expression.Constant(filter.ToUpper());
Expression containsMethod = Expression.Call(property, "Contains", null, target);
Expression<Func<TView, bool>> textFilterExpression =
Expression.Lambda<Func<TView, bool>>(containsMethod, parameter);
return textFilterExpression;
}
감사합니다.
사람들이 말하는 것처럼 "매력처럼 작동합니다". 당신이 첫 번째로 잘린 것은 트릭을했습니다. 감사합니다! 그냥 궁금해 : 매개 변수는 무엇에 사용됩니까? 나는 디버거를 살펴 봤는데 표현식의 일부를 "Param_0"과 같이 표현했지만, 전체 프로세스에서 어디에 사용 되었는가, 심지어 그것이 의미하는 바에 대한 단서도 없다. 하지만 어쨌든 코드가 작동하고 문제가 해결되었습니다. 다시 한 번 감사드립니다. 단지 내가 어떤 코드가 무엇을하는지 이해할 수 있도록 커버 아래에서 무슨 일이 일어나고 있는지 알고 싶습니다. –
'Func <,>'은 하나의 매개 변수를 취하므로'Func <,>'을 나타내는 람다 식을 만들 때 전달 된 값을 나타 내기 위해 매개 변수를 선언해야합니다. –