簡體   English   中英

如何檢查謂詞表達式是否已更改?

[英]How to check if predicate expression was changed?

 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)

這很容易,你可能沒有考慮到這一點。 由於PredicateBuilder每次構建新的謂詞實例 (注意你必須編寫predicate = predicate.And...所以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 ....

我發現IsStarted屬性似乎顯示是否已分配謂詞。

在我的代碼中,我使用它來構建復合搜索語句,其中搜索參數是可選的。 例如

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

我沒有嘗試過。

據我所知,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 */ }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM