Я хочу создать метод с такой подписью:
Expression<Func<TSource, bool>> CreatePropertyFilter<TSource>(Expression<Func<TSource, string>> selector, string value, TextMatchMode matchMode);
По сути, он принимает селектор свойств (например: p = p.Name
), строковое значение и значение перечисления, которое может быть StartsWith
, EndsWith
, Contains
, Exact
; для вариантов соответствия текста.
Как я могу реализовать метод так, чтобы его могли понять LINQ2Entities? Я уже реализовал метод, используя вложенные выражения вызова, как это:
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);
Проблема в том, что Linq2Entities не поддерживает выражения вызова.
Любой совет по этому поводу?
Спасибо!