假設有這么一個運算式目錄樹
Expression<Func<Customer, bool>> expression1 = c => (c.Id > 5 && c.Name.Contains("asdd")) ||( c.Id==1 || c.Id==2);現在運算式c.Id > 5 ,c.Name.Contains("asdd")這一類的已經決議出來了沒啥問題
關鍵是怎么能把圓括括號"()"也決議出來,否則這種多條件的,表達不出來原來的意思啊
uj5u.com熱心網友回復:
運算式樹不是已經給你結構了嗎?比如:
二目運算式OrElse,
左邊是:(c.Id > 5 && c.Name.Contains("asdd"))
右邊是:(c.Id==1 || c.Id==2)
可以看到括號的作用已經反映到運算式里了。
uj5u.com熱心網友回復:
是的,用ExpressionVisitor我可以取到運算式的Member,BinaryExpression,Constant,Method這幾部分,但是圓弧括號怎么取呢?難道要正則匹配出來嗎?
uj5u.com熱心網友回復:
我的目的是,把傳進來的運算式翻譯成Sql查詢條件
uj5u.com熱心網友回復:
邏輯上,你已經不需要括號了。括號的作用,已經反應到表達樹里了。
uj5u.com熱心網友回復:
現在我翻譯完是這樣的 Id > 5 AND Name like '%asdd%' OR Id = 1 OR Id = 2
uj5u.com熱心網友回復:
如果按照運算式的意思的話應該是(Id > 5 AND Name like '%asdd%') OR (Id = 1 OR Id = 2) 這個樣子的uj5u.com熱心網友回復:
二目運算式OrElse,----> 對應 SQL OR
左邊 ---> 對應 假設 L
右邊 ---> 對應 假設 R
SQL不就是 (L) OR (R)
把L和R擴展開,不就是你要的結果:((Id > 5) AND (Name like '%asdd%')) OR ((Id = 1) OR (Id = 2))
uj5u.com熱心網友回復:
我明白你的意思了,謝謝!我開始想的有偏差,我以為也能像取其他部分一樣重寫方法就能取到括號呢
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/85049.html
標籤:C#
