Je veux faire une méthode avec une signature comme celui-ci:paramétrés Linq Expression Aide
Expression<Func<TSource, bool>> CreatePropertyFilter<TSource>(Expression<Func<TSource, string>> selector, string value, TextMatchMode matchMode);
Fondamentalement, il faut un sélecteur de propriété (ex: p = p.Name
), une valeur de chaîne et une valeur enum qui peut être StartsWith
, EndsWith
, Contains
, Exact
; pour les options de correspondance de texte.
Comment puis-je implémenter la méthode d'une manière compréhensible par LINQ2Entities? Je l'ai déjà mis en œuvre la méthode en utilisant des expressions d'invocation imbriquées comme ceci:
Expression<Func<string, bool>> comparerExpression;
switch (matchMode)
{
case TextMatchMode.StartsWith:
comparerExpression = p => p.StartsWith(value);
break;
case TextMatchMode.EndsWith:
comparerExpression = p => p.EndsWith(value);
break;
case TextMatchMode.Contains:
comparerExpression = p => p.Contains(value);
break;
default:
comparerExpression = p => p.Equals(value);
break;
}
var equalityComparerParameter = Expression.Parameter(typeof(IncomingMail), null);
var equalityComparerExpression = Expression.Invoke(comparerExpression, Expression.Invoke(selector, equalityComparerParameter));
var equalityComparerPredicate = Expression.Lambda<Func<IncomingMail, bool>>(equalityComparerExpression, equalityComparerParameter);
Le problème est que Linq2Entities ne supporte pas les expressions d'invocation.
Un conseil?
Merci!
Merci, Ani! Exactement ce que je cherchais et travaillé comme un charme! Je suis juste trop frais dans le monde des expressions lambda. –