2012-02-29 83 views
2

我正在使用Dynamic Linq來查詢我們的數據庫,該字符串是基於用戶輸入的過濾器創建的。在一種情況下,我們需要在兩個字段上執行合併,以便將過濾器應用於結果。在Dynamic Linq中合併

產生的語法將是這個樣子:

(nullableField ?? requiredField) == "foo" 

或者,如果使用擴展方法:

(nullableField ?? requiredField).Contains("foo") 

動態LINQ的,或者至少是版本目前,我們在我們的項目,不支持coalesce,有沒有可用的實現或關於如何實現我自己的建議?我對錶情很少有經驗,我正在努力創造自己的表情。到目前爲止,下面的代碼適用於我的有限測試,但我不確定我是否已經正確地完成了它。

// ?? operator 
    Expression ParseCoalesce() 
    { 
     Expression left = ParseLogicalOr(); 
     if (token.id == TokenId.DoubleQuestion) 
     { 
      NextToken(); 
      Expression expr1 = ParseExpression(); 
      left = Expression.Coalesce(left, expr1); 
     } 
     return left; 
    } 

這個代碼的思考:

這是由ParseExpression()叫什麼名字?有沒有更好的方法來做到這一點?

+0

是微不足道的轉換爲'ConditionalExpression'實現它。你的系統是否支持? – Gabe 2012-02-29 15:36:37

+0

@加貝我想它可以。提供類似'(nullableField!= null?nullableField ==「foo」:requiredField ==「foo」)'? – Priz23 2012-02-29 15:43:39

回答

1

如果您的系統支持ConditionalExpression,你可以像

(nullableField != null ? nullableField == "foo" : requiredField == "foo") 

(nullableField != null ? nullableField : requiredField) == "foo" 
+0

儘管生成的字符串(當包含表名等時)比簡單的??有點混亂,我將事實上已經將ConditionExpression構建到Dynamic Linq中,並且需要定製實現。感謝您的幫助Gabe! – Priz23 2012-02-29 16:32:24