Prosty sposób
Wystarczy użyć
if (comparison == ComparisonType.StartsWith)
query = query.Where(e => e.StringProperty.StartsWith("SearchString"));
else if ...
hard way
Jeśli chcesz zrobić coś takiego, albo upewnić się, że dostawca LINQ można powiedzieć o ta nowa metoda jakoś i jak przekłada się na SQL (mało prawdopodobne), lub uniemożliwić twojej metodzie kiedykolwiek dojście do dostawcy LINQ i dostarczyć dostawcy czegoś, co on rozumie (ha r & D). Na przykład, zamiast
query.Where(e => CompMethod(e.StringProperty, "SearchString", comparsionType))
można stworzyć coś podobnego
var query = source.WhereLike(e => e.StringProperty, "SearchString", comparsionType)
z następującego kodu
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));
}
}
Można nawet dodać dodatkowe kryteria tędy
var query = from e in source.WhereLike(
e => e.StringProperty, "SearchString", comparsionType)
where e.OtherProperty == 123
orderby e.StringProperty
select e;
Bardzo, bardzo trudny sposób
Byłoby (technicznie) można przepisać drzewa wyrażenie zanim operator widzi, więc może użyć zapytania miał na myśli w pierwszej kolejności, ale ci” d musiał
- stworzyć
Where(this IQueryable<EntityType> source, Expression<Func<EntityType, bool>> predicate)
przechwycić Queryable.Where
,
- przepisać drzewa wyrażenie, zastępując swoją
CompMethod
, gdziekolwiek to jest, z jednej z metod String
,
- wywołaj oryginalny
Queryable.Where
z nowym wyrażeniem,
- , a przede wszystkim umiesz nadążać za powyższym rozszerzeniem w pierwszej kolejności!
Ale to chyba zbyt skomplikowane dla tego, co masz na myśli.
Ruben: Fenomenalny, to piekielne wyjaśnienie - kompletne, zrozumiałe, dokładne i dokładnie to, czego szukałem, dziękuję. Chciałbym także podziękować innym za ich pomoc. –