Quiero hacer un método con una firma como esta:parametrizado LINQ Expresión Ayuda
Expression<Func<TSource, bool>> CreatePropertyFilter<TSource>(Expression<Func<TSource, string>> selector, string value, TextMatchMode matchMode);
Básicamente, se necesita un selector de propiedad (por ejemplo: p = p.Name
), un valor de cadena y un valor de enumeración que puede ser StartsWith
, EndsWith
, Contains
, Exact
; para las opciones de concordancia de texto.
¿Cómo puedo implementar el método de una forma que LINQ2Entities pueda entender? Ya implementado el método de invocación utilizando expresiones anidadas así:
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);
El problema es que Linq2Entities no soporta expresiones de invocación.
¿Algún consejo sobre esto?
Gracias!
Gracias, Ani! Exactamente lo que estaba buscando y funcionó como un encanto! Estoy demasiado fresco en el mundo de las expresiones lambda. –