Я создаю библиотеку функций для одного из моих основных классов L2S, все из которых возвращают bool для проверки определенных ситуаций.
Пример:
Expression<Func<Account, bool>> IsSomethingX =
a => a.AccountSupplementary != null
&& a.AccountSupplementary.SomethingXFlag != null
&& a.AccountSupplementary.SomethingXFlag.Value;
Теперь, чтобы запросить, где это не так, я НЕ МОГУ сделать следующее:
var myAccounts= context.Accounts
.Where(!IsSomethingX); // does not compile
Однако, используя синтаксис класса PredicateBuilder, я придумал следующее:
public static IQueryable<T> WhereNot<T>(this IQueryable<T> items,
Expression<Func<T, bool>> expr1)
{
var invokedExpr = Expression.Invoke(expr1, expr1.Parameters.Cast<Expression>());
return items.Where(Expression.Lambda<Func<T, bool>>
(Expression.Not(invokedExpr), expr1.Parameters));
}
var myAccounts= context.Accounts
.WhereNot(IsSomethingX); // does compile
который фактически создает правильный SQL.
Это похоже на хорошее решение, и есть ли что-то, что мне нужно знать об этом, может вызвать у меня проблемы в будущем?