2015-06-07 62 views
3

我已經將其像創建的現有λ-表達:擴展lambda表達式

Expression<Func<Entities.Area, bool>> where = (x => (x.Created > this.Value || (x.Changed != null && x.Changed > this.Value))); 

現在,我必須與這一個延伸此表達式:

Expression<Func<Entities.Area, bool>> whereAdd = (x => x.Client.Id == ClientInfo.CurrentClient.Id); 

結果應該是這樣的:

Expression<Func<Entities.Area, bool>> where = (x => (x.Created > this.Value || (x.Changed != null && x.Changed > this.Value)) && x.Client.Id == ClientInfo.CurrentClient.Id); 

我不能直接更改第一個表達式的創建,因爲它不是我的代碼。

我希望有人能幫助我如何擴展第一個lambda表達式。

+0

爲E從Entities.Area不同類型? –

+0

哦對不起。不,E是Entities.Area(同一類型)。 – BennoDual

+0

http://stackoverflow.com/questions/457316/combining-two-expressions-expressionfunct-bool/457328#457328 – Jude

回答

2

只需創建一個新的AndAlso表達同時服用你的表情的屍體,並作出新的lambda表達式出來的是:

ParameterExpression param = Expression.Parameter(typeof(Entities.Area), "x"); 
Expression body = Expression.AndAlso(where.Body, whereAdd.Body); 

var newWhere = Expression.Lambda<Func<Entities.Area, bool>>(body, param); 

Console.WriteLine(newWhere.ToString()); 
// x => (((x.Created > Convert(value(UserQuery).Value)) OrElse ((x.Changed != null) AndAlso (x.Changed > Convert(value(UserQuery).Value)))) AndAlso (x.Client.Id == ClientInfo.CurrentClient.Id)) 
-1

Combining two expressions (Expression<Func<T, bool>>)

var body = Expression.AndAlso(where.Body, whereadd.Body); 
var lambda = Expression.Lambda<Func<Entities.Area,bool>>(body, where.Parameters[0]); 
+1

你能否請你的答案給出解釋爲什麼這段代碼回答這個問題?僅限代碼答案[不鼓勵](http://meta.stackexchange.com/questions/148272),因爲他們沒有教導解決方案。 – DavidPostill

+0

我首先給出了一個鏈接作爲評論upthere。半小時後,Poke的答案仍未被接受。所以我修改了Marc Gravel的答案(我已經鏈接了)併發布了它。我能爲此做些什麼解釋?老實說,令人驚訝的是queston被三次提高。 SO上的許多答案都是'AndAlso'。快速搜索就足以解決問題。 – Jude

+0

不夠公平,但是我會將鏈接從註釋插入到anser中作爲進一步的解釋。請參閱[合併兩個表達式(Expression>)](http://stackoverflow.com/a/457328) – DavidPostill