2015-04-28 2 views
1

Я пытаюсь выяснить, как работают предикаты. У меня есть фрагмент кода, где всегда будет поставляться один параметр, но может быть до 5 различных параметров.LinqKit Predicates

Если я попробовать этот способ

var predicate = PredicateBuilder.False<Data.AccountAllocation>();     

if (startDate.HasValue) 
    predicate = predicate.And(p => p.DateEntered >= startDate); 

if (endDate.HasValue) 
    predicate = predicate.And(p => p.DateEntered <= endDate); 

if (allocationTypeId.HasValue) 
    predicate = predicate.And(p => p.AllocationTypeID == allocationTypeId); 

if (allocationStatusID.HasValue) 
    predicate = predicate.And(p => p.AllocationStatusTypeID == allocationStatusID); 

var accountAllocation = await db.AccountAllocations.AsExpandable().Where(predicate).ToListAsync(); 

return accountAllocation; 

Он ничего не возвращает еще, если я пишу это так

var predicate = PredicateBuilder.False<Data.AccountAllocation>(); 

if (accountId > 0) 
    predicate = predicate.Or(p => p.AccountID == accountId); 

if (startDate.HasValue) 
    predicate = predicate.And(p => p.DateEntered >= startDate); 

if (endDate.HasValue) 
    predicate = predicate.And(p => p.DateEntered <= endDate); 

if (allocationTypeId.HasValue) 
    predicate = predicate.And(p => p.AllocationTypeID == allocationTypeId); 

if (allocationStatusID.HasValue) 
    predicate = predicate.And(p => p.AllocationStatusTypeID == allocationStatusID); 

var accountAllocation = await db.AccountAllocations.AsExpandable().Where(predicate).ToListAsync(); 

return accountAllocation; 

Он работает должным образом. Если я изменил первый предикат, учетная запись, от .Or до. И это не сработает.

.Или всегда кажется, бежит, но если я ставлю .Или для всех из них дата возвращается не правильно, так как она должна быть .И

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

ответ

1

Если вы только оценить And условия, которые вы должны начать с True предиката, в основном потому, что false && bool1 && bool2 ... всегда имеет значение false:

var predicate = PredicateBuilder.True<Data.AccountAllocation>(); 

Но когда есть Or предикат в цепи предикатами выражение становится true, если предикатоценивается как true.

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

var predicate = PredicateBuilder.True<Data.AccountAllocation>(); 
var initString = predicate.ToString(); 

if (startDate.HasValue) 
    predicate = predicate.And(p => p.DateEntered >= startDate); 

... 

if (predicate.ToString() == initString) 
    predicate = predicate.And(p => false);