2013-11-16 3 views
2

Ну, у меня есть два выражения X , YМожно игнорировать выражение, если оно пустое или пустое, не проверяя значение null в инструкции IF?

если флаг установлен, то у имеет выражение

Мне нужен List<mylist> v = list.where(x).where(y).ToList();

В этом случае, если выражение у равно нулю, то будет сгенерировано исключение,

Я знаю, что могу проверить нуль перед созданием запроса, но в огромном запросе это может быть кошмаром.

Так есть ли способ или значение, чтобы выразить выражение, игнорируемое при выполнении выражения?

+1

Какая ошибка? –

+0

Что вы ожидаете от этого «пустого» результата? Как он должен себя вести, когда вызывающий код получает экземпляр 'Expression >'? – AgentFire

+0

Я отредактирую свой вопрос и объясню, что я пытаюсь сделать. –

ответ

4

Вы можете добавить свои собственные методы расширения достаточно легко. Не сразу понятно, используете ли вы IQueryable<> или IEnumerable<> (ваш код не будет компилироваться в любом случае из-за проблем с корпусом и того факта, что метод Where возвращает List<T> и тот факт, что вы используете x в том же заявлении, которое вы «повторно объявить его), но вы можете справиться и легко:

public static class NullSafeExtensions 
{ 
    public static IEnumerable<T> NullSafeWhere(this IEnumerable<T> source, 
     Func<T, bool> predicate) 
    { 
     return predicate == null ? source : source.Where(predicate); 
    } 

    public static IQueryable<T> NullSafeWhere(this IQueryable<T> source, 
     Expression<Func<T, bool>> predicate) 
    { 
     return predicate == null ? source : source.Where(predicate); 
    } 
} 

Тогда:

var results = source.NullSafeWhere(x).NullSafeWhere(y); 

(конечно, это только нуль-безопасным с точки зрения предиката, а не источник ...)

+0

Это отличный ответ –

0

В вашем случае вызов метода с Expression<Func<BAL.vw_BudgetRecord, bool>> возвращаемым типом должен всегда возвращать выражение этого типа.

Предполагая, что на вашем примере вы можете вернуть bool? (nullable bool) в случае, если использование не в роли SuperAdmin.

Если я прав, вам следует изменить тип возвращаемого метода на Expression<Func<BAL.vw_BudgetRecord, bool?>>.

Если нет, вы меняете тип возврата просто на Expression; что позволит вам одновременно вернуть LambdaExpression и DefaultExpression.

4

Вы можете использовать оператор срастаться, чтобы обеспечить еще одно выражение, когда у устанавливается в нуль:

list.Where(y ?? (() => true)) 
Смежные вопросы