如何检查谓词表达式是否已更改?

时间:2015-06-25 09:52:21

标签: c# asp.net-mvc linq predicatebuilder linqkit

 var predicate = PredicateBuilder.True<o_order>();

这是我的谓词表达式,在某些条件下,我会用它附加表达式。

同样地

 if (!string.IsNullOrEmpty(param.sSearch))
                predicate = predicate.And(s => s.OrderID.ToString().Contains(param.sSearch));

现在我的问题是,如果这个表达式没有通过这个条件,那么会有任何表达式吗?我怎么知道它是否没有返回表达式。

我只想做 -

if(predicate==null)if(predicate contains no expression)

3 个答案:

答案 0 :(得分:3)

这很容易,你可能没有考虑过。由于PredicateBuilder每次构建新的谓词实例(注意你必须写predicate = predicate.And...所以你每次都要替换pred),那么你只需记住原始值并最终将最终值与之比较。

var predicate = PredicateBuilder.True<o_order>();
var oldPredicate = predicate;

if (!string.IsNullOrEmpty(param.sSearch))
    predicate = predicate.And(s => ........... );  // replace!

if (!string.IsNullOrEmpty(....))
    predicate = predicate.And(s => ........... );  // replace!

if(predicate == oldPredicate)   // was it changed?
    ; // no filters applied
else
    ; // some filters applied

但是很难说应用了哪些过滤器。如果您需要知道这一点,那么您必须将信息存储在一起(或者您必须分析谓词树,这可能更难):

var predicate = PredicateBuilder.True<o_order>();
var oldPredicate = predicate;

bool case1applied = !string.IsNullOrEmpty(....);
if (case1applied)
    predicate = predicate.And(s => ........... );

bool case2applied = !string.IsNullOrEmpty(....);
if (case2applied)
    predicate = predicate.And(s => ........... );

if(predicate == oldPredicate) // or the hard way: !case1applied && !case2applied
    ; // no filters applied
else
    if(case1applied && case2applied) // all filters applied
    else ....

答案 1 :(得分:3)

我发现IsStarted属性似乎表明是否已分配谓词。

在我的代码中,我使用它来构建复合搜索语句,其中搜索参数是可选的。 E.g。

var quoteDatePredicate= PredicateBuilder.New<SearchData>();

if (searchCriteria.QuoteFromDate.HasValue)
{
    quoteDatePredicate.And(x => x.QuoteDate >= searchCriteria.QuoteFromDate);
}

var saleDatePredicate = PredicateBuilder.New<SearchData>();

if (searchCriteria.SaleDate.HasValue)
{
    saleDatePredicate.And(x => x.SaleDate >= searchCriteria.SaleDateFrom);
}  

然后我创建另一个谓词变量并使用If语句添加实际分配给的任何谓词:

var datesPredicate = PredicateBuilder.New<SearchData>();

if (quoteDatePredicate.IsStarted) datesPredicate.Or(quoteDatePredicate);
if (saleDatePredicate.IsStarted) datesPredicate.Or(saleDatePredicate);

到目前为止,我的代码似乎工作得很好。

或者,在调试器中比较已分配和未分配的谓词变量似乎建议您可以使用它来检查是否已分配谓词:

if (dueOutOfDatePredicate.Parameters[0].Name = "f")

虽然我没试过。

答案 2 :(得分:2)

据我所知,PredicateBuilder没有公开任何返回所用表达式列表的方法。但是,您可以存储用于向PredicateBuilder添加表达式的条件

var predicate = PredicateBuilder.True<o_order>();
var cond1 = /* condition 1 */
var cond2 = /* condition 2 */
...
if (cond1) { /* add expression for condition 1 */ }
if (cond2) { /* add expression for condition 2 */ }
...
if (!cond1 && !cond2 && ...) { /* handle case of no expressions added */ }