Я пытаюсь понять, как работают предикаты. У меня есть фрагмент кода, в котором всегда будет указан один параметр, но может быть до 5 разных параметров.
Если я попробую так
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 всегда работает, но если я поставлю .Or для всех из них, возвращаемая дата неверна, так как она должна быть .And
Я пытаюсь понять, как заставить это работать, потому что будет время, когда все параметры будут необязательными. и я не смогу использовать .Или, в чем секрет получения .И работать независимо от того, сколько параметров добавлено.