2013-11-27 52 views
1

嗨:我試着看着其他職位。如果這是一個重複的帖子,我很抱歉。NHIBERNATE WHERE和多個OR條款的IQUERYOVER

SQL查詢是這樣的:

select * from ApiData where BrandID = 'SOUPBRAND' and Culture = 'de-de' 
or 
(BrandID = 'SOUPBRAND' and Culture = 'pt-br' and EntityType = 'contactus') 
or 
(BrandID = 'examplefoods') 

將NHibernate的查詢是什麼樣的?

這是我到目前爲止有:

var mainQuery = _session.QueryOver<ApiData>(); 

      foreach (var brandPermission in permissions) 
      { 
       var query = _session.QueryOver<ApiData>(); 
       if (!string.IsNullOrEmpty(brandPermission.Culture) && !string.IsNullOrEmpty(brandPermission.Publication)) 
       { 
        query = query.Where(a => (a.Culture == brandPermission.Culture) 
              && (a.Publication == brandPermission.Publication)); //FetchEntries(apiUser.DefaultCulture, apiUser.Publication); 
       } 
       else if (!string.IsNullOrEmpty(brandPermission.Culture)) 
       { 
        query = query.Where(a => (a.Culture == brandPermission.Culture)); //FetchEntries(apiUser.DefaultCulture); 
       } 

       query = query.Where(a => a.BrandId == brandPermission.BrandId); 

//Here I would like to add 
// mainQuery.AddORRestriction(query); 
} 

只是不知道如何去實現它。看到一個鏈接:http://www.methodicmadness.com/2012/04/extending-queryover-with-or.html但沒有幫助。

謝謝!

回答

5

感謝:https://www.google.com/url?q=http://ayende.com/blog/4023/nhibernate-queries-examples&usd=2&usg=AFQjCNG43MDXKhjZ9LrCVSldeZuruBSdQQ 和:https://www.google.com/url?q=https://stackoverflow.com/questions/14478430/c-sharp-nhibernate-multiple-where-conditions-in-session-queryover&usd=2&usg=AFQjCNHRKbQz3EKGqOOh0gSV0LW2taSX-w

我得到了以下解決方案:

var mainQuery = _session.QueryOver<ApiData>(); 

    var holdOr = Restrictions.Disjunction(); 
    foreach (var brandPermission in permissions) 
    { 
     var query = _session.QueryOver<ApiData>(); 
     var holdAnd = Restrictions.Conjunction(); 
     if (!string.IsNullOrEmpty(brandPermission.Culture) && !string.IsNullOrEmpty(brandPermission.Publication)) 
     { 
      holdAnd.Add(Restrictions.Eq("Culture", brandPermission.Culture)); 
      holdAnd.Add(Restrictions.Eq("Publication", brandPermission.Publication)); 
     } 
     else if (!string.IsNullOrEmpty(brandPermission.Culture)) 
     { 
      holdAnd.Add(Restrictions.Eq("Culture", brandPermission.Culture)); 
     } 

     holdAnd.Add(Restrictions.Eq("BrandId", brandPermission.BrandId)); 

     holdOr.Add(holdAnd); 
    } 
    mainQuery.Where(holdOr);