2015-10-07 3 views
0

Я хочу построить дерево выражений с равным, которое ведет себя так, как если бы оно было в SQL. То есть, я хочу, чтобы игнорировать случай строк т.д .:Мне нужно искать строки, игнорируя случай строк, используя деревья выражений

"ThIs Is A tEsT", "tHiS iS a TeSt", "this is a test" и "THIS IS A TEST" все должны матч "this is a test".

Я пробовал несколько вещей, и ничего не работает.

ответ

0

Я нашел самый прямой путь для выполнения этой задачи является Invoke пользовательский метод, как это:

public class Datum 
{ 
    public string Value { get; set; } 
} 

void Main() 
{ 
    var data = new List<Datum> { 
     new Datum { Value = "ThIs Is A tEsT" }, 
     new Datum { Value = "tHiS iS a TeSt" }, 
     new Datum { Value = "this is a test" }, 
     new Datum { Value = "THIS IS A TEST" } 
    }; 

    var queryableData = data.AsQueryable<Datum>(); 
    var pe = Expression.Parameter(typeof(Datum), "Value"); 
    var right = Expression.Constant("this is a test", typeof(string)); 

    // * First build a func that will use the method you want. In this case, it is going to be any equals that ignores case. 
    // * Next Invoke that method instead of Expression.Equal. 
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    Expression<Func<string, string, bool>> IgnoreCase = (op1, op2) => op1.Equals(op2, StringComparison.OrdinalIgnoreCase); 
    var e = Expression.Invoke(IgnoreCase, Expression.Property(pe, "Value"), right); 

    //var e = Expression.Equal(Expression.Property(pe, "Value"), right); 
    var whereCallExpression = Expression.Call(
     typeof(Queryable), 
     "Where", 
     new Type[] { queryableData.ElementType }, 
     queryableData.Expression, 
     Expression.Lambda<Func<Datum, bool>>(e, pe)); 
    var results = queryableData.Provider.CreateQuery<Datum>(whereCallExpression); 
    results.Dump(); 
} 
Смежные вопросы