Подтвердить что ты не робот

LINQ to SQL: указание предварительно созданного выражения

Я создаю библиотеку функций для одного из моих основных классов 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.

Это похоже на хорошее решение, и есть ли что-то, что мне нужно знать об этом, может вызвать у меня проблемы в будущем?

4b9b3361

Ответ 1

Я написал некоторый тестовый код, используя метод расширения WhereNot, и он выглядит хорошо. Решение @Stephan также работает, но я бы пошел на удобочитаемость метода расширения.

Ответ 2

var compiled = IsSomethingX.Compile();
var myAccounts = context.Accounts.Where(x => !compiled(x));