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;

它工作正常。如果我将第一个谓词(帐户)从 .或到 .而且它不起作用。

.或者似乎总是运行,但如果我把.或者对于所有这些,返回的日期不正确,因为它需要是一个 .和

我正在尝试弄清楚如何使其工作,因为总有一天所有参数都是可选的。 而且我将无法使用 .或者,获得 .并且无论添加多少参数都可以工作。

如果你只计算And条件,你必须从True谓词开始,主要是因为false && bool1 && bool2 ...总是计算结果为false

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

但是,当谓词链中存在Or谓词时,如果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);

相关内容

  • 没有找到相关文章

最新更新