Как создать дерево выражений, чтобы сделать то же самое, что и StartsWith

В настоящее время у меня есть этот метод для сравнения двух чисел

Private Function ETForGreaterThan(ByVal query As IQueryable(Of T), ByVal propertyValue As Object, ByVal propertyInfo As PropertyInfo) As IQueryable(Of T)

    Dim e As ParameterExpression = Expression.Parameter(GetType(T), "e")
    Dim m As MemberExpression = Expression.MakeMemberAccess(e, propertyInfo)
    Dim c As ConstantExpression = Expression.Constant(propertyValue, propertyValue.GetType())
    Dim b As BinaryExpression = Expression.GreaterThan(m, c)
    Dim lambda As Expression(Of Func(Of T, Boolean)) = Expression.Lambda(Of Func(Of T, Boolean))(b, e)
    Return query.Where(lambda)

End Function

Он отлично работает и потребляется таким образом

query = ETForGreaterThan(query, Value, propertyInfo)

Как видите, я даю ей коллекцию IQueryable, и она добавляет к ней предложение where, основанное на свойстве и значении. Y может создавать эквиваленты Lessthan, LessOrEqualThan и т. д., поскольку в System.Linq.Expressions.Expression эти операторы предопределены.

¿Как я могу преобразовать этот код, чтобы сделать то же самое со строками? System.Linq.Expressions.Expression не дает мне предопределенного оператора, такого как «содержит» или «начать с», и я действительно нуб с деревьями выражений.

Спасибо, и, пожалуйста, опубликуйте свой ответ на C#/VB. Выберите тот, в котором вы чувствуете себя более комфортно.


person Jonathan    schedule 29.12.2010    source источник


Ответы (2)


Это не оператор, а метод, поэтому вы можете вызвать его с помощью Expression.Call(), где параметр methodinfo будет typeof(string).GetMethod("StartsWith").

person fejesjoco    schedule 29.12.2010
comment
Я читаю об этом, но раньше я не использовал деревья выражений. ¿Не могли бы вы привести пример, пожалуйста? - person Jonathan; 29.12.2010

person    schedule
comment
Проверено и снова работает. В два раза меньше, чем за 24 часа. Том, можно купить тебе пива? :D Спасибо, действительно. - person Jonathan; 29.12.2010
comment
Том - вы, сэр, герой - person whiteshooz; 11.08.2017