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)
這與第一個查詢完全相同。看起來我太親密了,一定很簡單,我錯過了。任何人都可以看到我在這裏做錯了嗎?
感謝,
特里
衛生署!我一定要雙目失明,謝謝你指出我明顯的錯誤。 – tblank 2010-04-26 19:10:01