LinqKit谓词

时间:2015-04-28 19:35:28

标签: predicates linqkit

我想弄清楚Predicates是如何工作的。我有一段代码,其中一个参数将始终提供,但最多可以有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用于所有这些,则返回的日期不正确,因为它需要是.And

我正在试图弄清楚如何让它工作,因为有一段时间所有参数都是可选的。并且我将无法使用。或者,获得.And工作的秘诀是什么,无论有多少参数被添加。

1 个答案:

答案 0 :(得分:1)

如果您只评估for (int i =0; i < [self.mapView.annotations count]; i++) { if ([[self.mapView.annotations objectAtIndex:i] isKindOfClass:[CustomAnnotation class]]) { CustomAnnotationClass *annotation=[self.mapView.annotations objectAtIndex:i]; if (annotation.expirationDuration <= 18000) { CustomAnnotationClass *newAnnotation = annotation; newAnnotation.pinColor = purple; [self.mapView removeAnnotation:[self.mapView.annotations objectAtIndex:i]]; [self.mapView addAnnotation:newAnnotation]; } } } 条件,则必须以And谓词开头,主要是因为True始终评估为false && bool1 && bool2 ...

false

但是,当谓词链中有var predicate = PredicateBuilder.True<Data.AccountAllocation>(); 谓词时,如果Or谓词的计算结果为true,则表达式变为Or

您可能以true谓词开头,因为您不想返回任何未输入单个参数的数据。您可以通过检查结尾处的谓词来实现此目的:

False