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