2016-12-11 2 views
4

안녕에 조건의 LINQ 표현 곳 엔티티 아이

어떻게 SQL로 번역하기 위해 LINQ 식을 통해 문 다음 구축 할 수

?

builder.Where(e => e.SomeChild.Name.ToLower() == "something"); 

builder은 DbContext입니다.

_property = e => e.Name; 
... 
builder.Where(insensitiveEqualityPredicate("whatever")); 

그러나 :

private readonly Expression<Func<TEntity, TProperty>> _property; 

private Expression<Func<TEntity, bool>> insensitiveEqualityPredicate(string formula) 
     { 
      var parameter = Expression.Parameter(typeof(TEntity)); 
      var property = (PropertyInfo)((MemberExpression)_property.Body).Member; 
      var propertyParameter = Expression.Parameter(property.DeclaringType); 
      var lowerExpression = Expression.Call(
        Expression.Invoke(_property, propertyParameter), 
        typeof(string).GetMethods().Where(m => m.Name == "ToLower" && m.GetParameters().ToList().Count == 0).FirstOrDefault() 
        ); 
      return Expression.Lambda<Func<TEntity, bool>>(
       Expression.Equal(
        lowerExpression, 
        Expression.Constant(formula.ToLower(), typeof(string)) 
       ), 
       parameter 
      ); 
     } 

그것은 매력처럼 작동 : 내가 직접 호출 할 때, 그래서이 방법을 WHERE 조건을 구축이

select ... from someTable 
inner join childTable on ... 
where LOWER(childTable.Name) = @someParam 

처럼 올바르게 해석 있어요 어린이 조건 :

_property = e => e.SomeChild.Name; 
... 
builder.Where(insensitiveEqualityPredicate("whatever")); 

때문에 :

The LINQ expression 'Param_0.Name.Equal("whatever")' could not be translated and will be evaluated locally. 

올바른 방법은 무엇입니까?

미리 감사드립니다. 나의 이해함으로써

+0

_property'''같은 전자 => e.SomeChilld.Name' 정확한 => e.Name' 또는'예를 발현 보유 ? –

+0

네, 맞습니다. 나는 명확하게 그것을 편집 할 것입니다 – rudolfdobias

답변

3

, 당신은 e => e.Name 같은 람다 식, e => e.SomeChild.Name 등으로 초기화된다 (실제로 Expression<Func<TEntity, string>>을의이 특별한 경우) 유형 Expression<Func<TEntity, TProperty>>의 필드 _property

당신이 할 수 원하는 조건을 구축하기 위해 _property 발현 파라미터를 재사용하여 새로운 표현베이스로 Body 속성을 사용

private readonly Expression<Func<TEntity, TProperty>> _property; 

private Expression<Func<TEntity, bool>> insensitiveEqualityPredicate(string formula) 
{ 
    return Expression.Lambda<Func<TEntity, bool>>(
     Expression.Equal(
      Expression.Call(_property.Body, "ToLower", Type.EmptyTypes), 
      Expression.Constant(formula.ToLower(), typeof(string)) 
     ), 
     _property.Parameters 
    ); 
} 
+1

훨씬 더 우아하고, 결코 배우는 것을 멈추지 않습니다. 고맙습니다. – rudolfdobias