LinqKit 谓词
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;
这样写的话returns什么都没有
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
我正在尝试弄清楚如何让它工作,因为总有一天所有参数都是可选的。而且我将无法使用 .Or,获得 .And 的秘诀是什么,而不管添加了多少参数。
如果您只评估 And
条件,您必须从 True
谓词开始,主要是因为 false && bool1 && bool2 ...
总是评估为 false
:
var predicate = PredicateBuilder.True<Data.AccountAllocation>();
但是当谓词链中有一个 Or
谓词时,如果 Or
谓词的计算结果为 true
,则表达式变为 true
。
您可能从 False
谓词开始,因为您不想 return 输入任何非单个参数的数据。您可以通过检查末尾的谓词来实现:
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);
我想弄清楚谓词是如何工作的。我有一段代码,其中始终提供一个参数,但最多可能有 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;
这样写的话returns什么都没有
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
我正在尝试弄清楚如何让它工作,因为总有一天所有参数都是可选的。而且我将无法使用 .Or,获得 .And 的秘诀是什么,而不管添加了多少参数。
如果您只评估 And
条件,您必须从 True
谓词开始,主要是因为 false && bool1 && bool2 ...
总是评估为 false
:
var predicate = PredicateBuilder.True<Data.AccountAllocation>();
但是当谓词链中有一个 Or
谓词时,如果 Or
谓词的计算结果为 true
,则表达式变为 true
。
您可能从 False
谓词开始,因为您不想 return 输入任何非单个参数的数据。您可以通过检查末尾的谓词来实现:
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);