2015-06-25 3 views
4
var predicate = PredicateBuilder.True<o_order>(); 

Это мое предикатное выражение, где на некоторых определенных условиях я буду добавлять выражения с ним.Как проверить, было ли изменено предикат?

Аналогично

if (!string.IsNullOrEmpty(param.sSearch)) 
       predicate = predicate.And(s => s.OrderID.ToString().Contains(param.sSearch)); 

Теперь мой вопрос, если это выражение не проходит мимо этого условия, то будет ли любое выражение? и как я могу узнать, не возвращает ли это выражение.

Просто я хочу DO-

if(predicate==null) или if(predicate contains no expression)

+0

Что такое 'PredicateBuilder'? – dotctor

+0

@dotctor, построитель выражений LINQ! Нет? – Manoj

+0

@dotctor: это «традиционное» имя класса для служебных операций над предикатами Linq, см., Например, http://www.albahari.com/nutshell/predicatebuilder.aspx – quetzalcoatl

ответ

3

Это так просто, вы, вероятно, не считаете, что. Поскольку PredicateBuilder создает новые предикатные экземпляры каждый раз (обратите внимание, что вы должны написать predicate = predicate.And..., чтобы вы меняли каждый раз каждый), тогда вы можете просто просто запомнить значение и в конечном итоге сравнить окончательное значение с этим.

var predicate = PredicateBuilder.True<o_order>(); 
var oldPredicate = predicate; 

if (!string.IsNullOrEmpty(param.sSearch)) 
    predicate = predicate.And(s => ...........); // replace! 

if (!string.IsNullOrEmpty(....)) 
    predicate = predicate.And(s => ...........); // replace! 

if(predicate == oldPredicate) // was it changed? 
    ; // no filters applied 
else 
    ; // some filters applied 

Было бы трудно, однако сказать , которые были применены фильтры. Если вам нужно знать, что, то вы должны хранить информацию вместе (или вы должны проанализировать дерево предиката, который может быть сложнее):

var predicate = PredicateBuilder.True<o_order>(); 
var oldPredicate = predicate; 

bool case1applied = !string.IsNullOrEmpty(....); 
if (case1applied) 
    predicate = predicate.And(s => ...........); 

bool case2applied = !string.IsNullOrEmpty(....); 
if (case2applied) 
    predicate = predicate.And(s => ...........); 

if(predicate == oldPredicate) // or the hard way: !case1applied && !case2applied 
    ; // no filters applied 
else 
    if(case1applied && case2applied) // all filters applied 
    else .... 
2

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

var predicate = PredicateBuilder.True<o_order>(); 
var cond1 = /* condition 1 */ 
var cond2 = /* condition 2 */ 
... 
if (cond1) { /* add expression for condition 1 */ } 
if (cond2) { /* add expression for condition 2 */ } 
... 
if (!cond1 && !cond2 && ...) { /* handle case of no expressions added */ } 
2

Я нашел, что IsStarted свойства кажется, чтобы показать, если предикат был назначен.

В моем коде я использовал это для создания композитных операторов поиска, где параметры поиска являются необязательными. Например.

var quoteDatePredicate= PredicateBuilder.New<SearchData>(); 

if (searchCriteria.QuoteFromDate.HasValue) 
{ 
    quoteDatePredicate.And(x => x.QuoteDate >= searchCriteria.QuoteFromDate); 
} 

var saleDatePredicate = PredicateBuilder.New<SearchData>(); 

if (searchCriteria.SaleDate.HasValue) 
{ 
    saleDatePredicate.And(x => x.SaleDate >= searchCriteria.SaleDateFrom); 
} 

А потом я создаю еще одну переменный предикат и использовать If заявление, чтобы добавить любые предикаты, которые были фактически присвоенными:

var datesPredicate = PredicateBuilder.New<SearchData>(); 

if (quoteDatePredicate.IsStarted) datesPredicate.Or(quoteDatePredicate); 
if (saleDatePredicate.IsStarted) datesPredicate.Or(saleDatePredicate); 

До сих пор, что, кажется, работает хорошо в моем коде.

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

if (dueOutOfDatePredicate.Parameters[0].Name = "f") 

Я не пробовал, что, хотя.