2010-09-03 59 views
7

我想用NHLambdaExtensions創建一個帶有NHibernate Criteria API的not in子句。閱讀文檔,我能夠做如何表達「不在」使用lambdas?

.Add(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 })) 

然而,當我把它包起來,以實現in條款各地SqlExpression.Not我得到

Error 5 The best overloaded method match for 'NHibernate.LambdaExtensions.SqlExpression.Not<oms_dal.Models.Zone>(System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>)' has some invalid arguments 
Error 6 Argument '1': cannot convert from 'NHibernate.Criterion.ICriterion' to 'System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>' 

我使用這段代碼的錯誤

.Add(SqlExpression.Not<Zone>(SqlExpression.In<Zone>(x => zoneAlias.ZoneId, new int[] { 1008, 1010 }))) 

我該如何做到這一點?使用普通的標準API,我能夠做到這一點

.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 }))) 

回答

1

與標準直接沒有工作(我一般用Linq2NH),但看起來不只是想要一個布爾拉姆達,所以你不能給它另一個標準。這可能工作,雖然我已經看到新罕布什爾州與陣營成員在lambdas麻煩:

.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId)) 

編輯:廢話。這裏發生的事情是該框架實際上並沒有使用lambda,所以在編譯時,框架在運行查詢的過程中從未真正調用它。而是反思性地檢查委託的MSIL,反向設計您的lambda表達式並將其轉換爲SQL命令的字符串。也就是說,顯然,設計者試圖通過指定你正在做什麼(在這種情況下是你聲明的SqlExpression的類型)的提示並尋找模式來識別流程來簡化一個相當複雜的流程。但在這種情況下,即使有提示,框架也不知道你想要做什麼。

如果後面評估譯者不()子句不能占卜邏輯迴路或方法調用的目的,你可能會被套牢

.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008 
           || z.ZoneId == 1010)) 

有誰知道我不得不這種方式歸結表達式Linq2NHibernate能夠正常工作。

+0

正確的,它要一個布爾拉姆達。使用你的代碼,NH現在說當我執行查詢時,無法從new [] {1008,1010} .Contains(z.ZoneId)'確定成員類型。 – Mike 2010-09-03 19:28:26

+0

現在提供的新代碼總是給出錯誤「無法確定來自...的成員」。我能想到的最簡單和最醜陋的解決方案就是簡單地執行'.Add(SqlExpression.Not(()=> zoneAlias.ZoneId == 1008))'。 – Mike 2010-09-07 16:18:13

2

使用舊世界與lambda表達式似乎工作:

.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));