Il modo più semplice
Basta usare
if (comparison == ComparisonType.StartsWith)
query = query.Where(e => e.StringProperty.StartsWith("SearchString"));
else if ...
Il modo più duro
Se si vuole fare qualcosa di simile, o assicurarsi che il vostro fornitore di LINQ può essere detto di questo nuovo metodo in qualche modo, e come si traduce in SQL (improbabile), o impedisce al metodo di raggiungere il provider LINQ e fornire al provider qualcosa che capisce (ha rd). Ad esempio, invece di
query.Where(e => CompMethod(e.StringProperty, "SearchString", comparsionType))
è possibile creare qualcosa di simile
var query = source.WhereLike(e => e.StringProperty, "SearchString", comparsionType)
con il seguente codice
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));
}
}
È anche possibile aggiungere ulteriori criteri in questo modo
var query = from e in source.WhereLike(
e => e.StringProperty, "SearchString", comparsionType)
where e.OtherProperty == 123
orderby e.StringProperty
select e;
Il modo molto, molto difficile
Sarebbe (tecnicamente) essere possibile riscrivere l'albero di espressione prima che il provider lo vede, in modo da possibile utilizzare la query che aveva in mente, in primo luogo, ma si' d dover
- creare un
Where(this IQueryable<EntityType> source, Expression<Func<EntityType, bool>> predicate)
per intercettare il Queryable.Where
,
- riscrivere l'albero di espressione, sostituendo il tuo
CompMethod
, ovunque essa sia, con uno dei metodi String
,
- chiama l'originale
Queryable.Where
con l'espressione riscritta,
- e in primo luogo, è possibile seguire il metodo di estensione sopra in primo luogo!
Ma probabilmente è troppo complicato per quello che avevi in mente.
Ruben: Fenomenale, questa è un'inferno di una spiegazione: completa, comprensibile, completa ed esattamente ciò che stavo cercando, grazie. Vorrei anche ringraziare gli altri per la loro assistenza. –