Простой способ
Просто используйте
if (comparison == ComparisonType.StartsWith)
query = query.Where(e => e.StringProperty.StartsWith("SearchString"));
else if ...
Трудный путь
Если вы хотите сделать что-то подобное, либо убедитесь, что ваш поставщик LINQ каким-то образом проинформирован об этом новом методе, и как он переводится в SQL (маловероятно), либо не позволяйте вашему методу когда-либо достичь поставщика LINQ, и предоставьте провайдер что-то понимает (сложно). Например, вместо
query.Where(e => CompMethod(e.StringProperty, "SearchString", comparsionType))
вы можете создать что-то вроде
var query = source.WhereLike(e => e.StringProperty, "SearchString", comparsionType)
со следующим кодом
public enum ComparisonType { StartsWith, EndsWith, Contains }
public static class QueryableExtensions
{
public static IQueryable<T> WhereLike<T>(
this IQueryable<T> source,
Expression<Func<T, string>> field,
string value,
SelectedComparisonType comparisonType)
{
ParameterExpression p = field.Parameters[0];
return source.Where(
Expression.Lambda<Func<T, bool>>(
Expression.Call(
field.Body,
comparisonType.ToString(),
null,
Expression.Constant(value)),
p));
}
}
Вы даже можете добавить дополнительные критерии таким образом
var query = from e in source.WhereLike(
e => e.StringProperty, "SearchString", comparsionType)
where e.OtherProperty == 123
orderby e.StringProperty
select e;
Очень, очень трудный путь
(технически) можно было бы переписать дерево выражений до того, как провайдер его увидит, так что вы можете использовать запрос, который вы имели в виду, но вам нужно будет
- создать
Where(this IQueryable<EntityType> source, Expression<Func<EntityType, bool>> predicate)
для перехвата Queryable.Where
,
- переписать дерево выражений, заменив
CompMethod
, где бы он ни находился, одним из String
методов,
- вызовите оригинал
Queryable.Where
с переписанным выражением
- и, прежде всего, прежде всего, следуйте вышеприведенному методу расширения!
Но это, вероятно, слишком сложно для того, что вы имели в виду.