2013-03-20 87 views
1

如何添加多個And和Or在Where子句中如何在Predicate Descriptionabar的where子句中添加多個Or和And Operations。 ex。如何使用Ideablade謂詞描述

List <PredicateDescription> pdList = new List<PredicateDescription>(); 

Dictionary< int, List< PredicateDescription>> pdDateList = new Dictionary< int, List< PredicateDescription>>(); 

var pds = pdList.ToArray(); 

if (((pds.Length > 0) || (pdDateList.Count > 0))) 
{ 

    CompositePredicateDescription predicate = null; 
    if (pds.Length > 0) 
    { 
       predicate = PredicateBuilder.And(pds); 
    }      
    List<PredicateDescription> AndList = null;      
    CompositePredicateDescription compositePredicateDescription = null; 
    for (int i = 0; i < pdDateList.Count; i++) 
    { 
      List<PredicateDescription> pdlist1 = pdDateList[i]; 
      AndList = new List<PredicateDescription>(); 
      foreach (PredicateDescription pdesc in pdlist1) 
      { 
        AndList.Add(pdesc); 
      } 
      if (AndList.Count > 0) 
      { 
       if (predicate != null) 
       { 
         if (AndList.Count == 2) 
         { 
          predicate.Or(AndList[0].And(AndList[1])); 
         } 
         else if (AndList.Count == 1) 
         { 
          predicate.Or(AndList[0]); 
         } 
       } 
      } 
    } 
} 

if (predicate == null) 

{ 

predicate = compositePredicateDescription; 

} 

       var filterQuery = query.Where(predicate);      
       data = Globals.sLDManager.ExecuteQuery(filterQuery); 

正如上面我曾試圖在CompositePredicateDescription添加或運營商,但它不工作

我想下面的查詢運行 -

Select * from Tabel1 where t.field1=1 and t.field2=1 and t.field3=1 Or (t.field4=1 and t.field5=1) Or (t.field6=1 and t.field7=1)

如何運行上面的查詢使用ideablade。

回答

2

在這種情況下,您應該可以使用CompositePredicateDescription,而不會出現任何問題。它怎麼不起作用?

下面是一個例子:

PredicateDescription p1 = PredicateBuilder.Make(typeof(Product), "UnitPrice", FilterOperator.IsGreaterThanOrEqualTo, 24); 
    PredicateDescription p2 = PredicateBuilder.Make(typeof(Product), "Discontinued", FilterOperator.IsEqualTo, true); 

    CompositePredicateDescription p3 = p1.And(p2); 

    PredicateDescription p4 = PredicateBuilder.Make(typeof(Product), "UnitsInStock", FilterOperator.IsGreaterThanOrEqualTo, 1); 
    PredicateDescription p5 = PredicateBuilder.Make(typeof(Product), "UnitsOnOrder", FilterOperator.IsGreaterThanOrEqualTo, 1); 

    CompositePredicateDescription p6 = p1.And(p2); 

    CompositePredicateDescription p7 = p3.Or(p6); 

    var query = mgr.Products.Where(p7); 

上面的代碼會生成以下WHERE語句(從SQL事件探查器),它具有相同的圖案,在查詢的WHERE語句:

WHERE (([Extent1].[UnitPrice] >= cast(24 as decimal(18))) AND (1 = [Extent1].[Discontinued])) OR (([Extent1].[UnitPrice] >= cast(24 as decimal(18))) AND (1 = [Extent1].[Discontinued])) 

如果你還沒有這樣做,你可能想看看動態WHERE子句中的DevForce Resource Center文章。

+0

感謝您的回覆..我也執行了上述相同的代碼。這個對我有用。 – user1782872 2013-03-22 12:30:17