2010-04-26 56 views
1

我一直非常高興地使用PredicateBuilder,但到現在爲止只用於只有連接的AND語句或OR語句的查詢。現在,第一次,我需要一雙或報表連同一些和語句這樣嵌套:如何在Linq中使用嵌套或條件式的PredicateBuilder

select x from Table1 where a = 1 AND b = 2 AND (z = 1 OR y = 2) 

使用從Albahari的文件,我已經構建我的表情是這樣的:

Expression<Func<TdIncSearchVw, bool>> predicate = 
    PredicateBuilder.True<TdIncSearchVw>(); // for AND 
Expression<Func<TdIncSearchVw, bool>> innerOrPredicate = 
    PredicateBuilder.False<TdIncSearchVw>(); // for OR 

innerOrPredicate = innerOrPredicate.Or(i=> i.IncStatusInd.Equals(incStatus)); 
innerOrPredicate = innerOrPredicate.Or(i=> i.RqmtStatusInd.Equals(incStatus)); 

predicate = predicate.And(i => i.TmTec.Equals(tecTm)); 
predicate = predicate.And(i => i.TmsTec.Equals(series)); 
predicate = predicate.And(i => i.HistoryInd.Equals(historyInd)); 

predicate.And(innerOrPredicate); 
var query = repo.GetEnumerable(predicate); 

這會導致SQL完全忽略2個OR短語。

select x from TdIncSearchVw 
    where ((this_."TM_TEC" = :p0 and this_."TMS_TEC" = :p1) 
    and this_."HISTORY_IND" = :p2) 

如果我嘗試使用剛剛或短語,如:

Expression<Func<TdIncSearchVw, bool>> innerOrPredicate = 
    PredicateBuilder.False<TdIncSearchVw>(); // for OR 
innerOrPredicate = innerOrPredicate.Or(i=> i.IncStatusInd.Equals(incStatus)); 
innerOrPredicate = innerOrPredicate.Or(i=> i.RqmtStatusInd.Equals(incStatus)); 
var query = repo.GetEnumerable(innerOrPredicate); 

我得到SQL如預期一樣:

select X from TdIncSearchVw 
    where (IncStatusInd = incStatus OR RqmtStatusInd = incStatus) 

如果我嘗試使用剛剛和詞組,例如:

predicate = predicate.And(i => i.TmTec.Equals(tecTm)); 
predicate = predicate.And(i => i.TmsTec.Equals(series)); 
predicate = predicate.And(i => i.HistoryInd.Equals(historyInd)); 
var query = repo.GetEnumerable(predicate); 

我得到SQL如:

select x from TdIncSearchVw 
    where ((this_."TM_TEC" = :p0 and this_."TMS_TEC" = :p1) 
    and this_."HISTORY_IND" = :p2) 

這與第一個查詢完全相同。看起來我太親密了,一定很簡單,我錯過了。任何人都可以看到我在這裏做錯了嗎?

感謝,

特里

回答

3

難道不應該是:

predicate = predicate.And(i => i.TmTec.Equals(tecTm)); 
predicate = predicate.And(i => i.TmsTec.Equals(series)); 
predicate = predicate.And(i => i.HistoryInd.Equals(historyInd)); 

predicate = predicate.And(innerOrPredicate); 
var query = repo.GetEnumerable(predicate); 

,而不是(OR謂詞不獲取設置爲可變):

predicate = predicate.And(i => i.TmTec.Equals(tecTm)); 
predicate = predicate.And(i => i.TmsTec.Equals(series)); 
predicate = predicate.And(i => i.HistoryInd.Equals(historyInd)); 

predicate.And(innerOrPredicate); 
var query = repo.GetEnumerable(predicate); 
+0

衛生署!我一定要雙目失明,謝謝你指出我明顯的錯誤。 – tblank 2010-04-26 19:10:01