2017-01-27 3 views
0

を比較私はStartsWithで実行可能なコードを持っていますが、私の代わりにStartsWithCompareを使用する必要があります。ラムダ式が文字列

LambdaExpression startsWithLambda = (Expression<Func<string, string, bool>>)((x, s) => x.StartsWith(s)); // works 
// LambdaExpression startsWithLambda = (Expression<Func<string, string, bool>>)((x, s) => string.Compare(x,s) > 0); - doesn't work 

MethodInfo startsWithMI = (startsWithLambda.Body as MethodCallExpression).Method; 

ParameterExpression param = Expression.Parameter(typeof(T)); 
Expression nameProp = Expression.Property(param, _propertyName); 

Expression filteredOk = Expression.Constant(true); 

Expression startsWithStringExpr = Expression.Constant(_filter); 
Expression startsWithCondition = Expression.Call(nameProp, startsWithMI, startsWithStringExpr); 

filteredOk = Expression.AndAlso(filteredOk, startsWithCondition); 

Expression<Func<T, bool>> where = Expression.Lambda<Func<T, bool>>(filteredOk, new ParameterExpression[] { param }); 

var result = orderedQuery.Where(where).Take(_linesCount); 

ラムダ式でstring.Compareを実装する方法は?

答えて

0

解を見つける: 式startsWithCondition = Expression.Call(startsWithMI、nameProp、startsWithStringExpr);

コールメソッドの静的メソッドパラメータを使用する場合は、切り替えます。