5
 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)

4

3 に答える 3

3

これはとても簡単です。PredicateBuilder は毎回新しい述語インスタンスを作成するため(毎回 pred を置き換えるように記述する必要があることに注意してくださいpredicate = predicate.And...)、単純に元の値を覚えておいて、最終的にそれに対して最終的な値を比較することができます。

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 ....
于 2015-06-25T10:53:27.390 に答える
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 */ }
于 2015-06-25T10:47:28.127 に答える