2013-05-30 25 views
1

我有一個表中有許多記錄,可以通過rowstatus,創建日期,修改日期進行過濾。構建可選過濾器的標準列表以檢索記錄nhibernate c#

我使用流利的nhibernate作爲ORM。

現在可以進來的WebAPI請求可以是:?

rowstatus = 0 OR rowstatus = 0 & createddate = 2013年5月30日 OR createddate = 2013年5月30日 OR modifieddate = 05-29-2013 & rowsstatus = 0

您可以看到過濾器的任何組合都可以進入查詢字符串。

我想知道,我該如何動態構建一個條件列表並將其提供給我的ISession對象來執行。什麼是最好的方式來做到這一點。

目前我有這麼多的重載函數來做到這一點,它是醜陋的。這是我正在使用的一個例子。我想要動態注入rowstatus和createddate。

_session.QueryOver<ApiData>() 
          .Where(a => (a.status== rowstatus) 
             && (a.createdDate== createddate)).List().ToList(); 

回答

0

這是怎麼了,我終於做到了:

 var status = queryParams.FirstOrDefault(q => q.Key == "status").Value; 
     var entity = queryParams.FirstOrDefault(q => q.Key == "entity").Value; 
     var start = queryParams.FirstOrDefault(q => q.Key == "start").Value; 

     if(!string.IsNullOrEmpty(status)) 
     { 
      query.Where(r => r.RowStatus == Convert.ToInt32(status)); 
     } 
     if (!string.IsNullOrEmpty(entity)) 
     { 
      query.Where(r => r.EntityType == entity); 
     } 

     //Ensure that this should be the last filter criteria to be applied 
     if (!string.IsNullOrEmpty(start)) 
     { 
      query.Skip(Convert.ToInt32(start)); 
     } 

     var count = query.RowCount(); 

     var results = query.Take(apiUser.ApiLimit).List().Select(c => _cryptography.Decrypt(c.Json)).ToList(); 
1

我用nHibernate Criteria查詢這種類型的場景,因爲它們非常靈活,你可以建立起來,你這取決於所提供的搜索參數去。

我已經根據您在問題中指定的某些標準爲您創建了一個基本示例,您應該可以修改我的示例以適合您的特定需求。

public IList<ApiData> SearchApiData(int? rowStatus, DateTime? createdDate) 
{ 

     ICriteria query = _session.CreateCriteria<ApiData>(); 

     if (rowStatus.HasValue) 
     { 
      query.Add(Restrictions.Eq("RowStatus", rowStatus.Value)); 
     } 

     if (createdDate.HasValue) 
     { 
      query.Add(Restrictions.Eq("CreatedDate", createdDate.Value)); 
     } 

     return query.List<ApiData>(); 

} 

此外,當我有很多搜索參數,我通常創建一個類結構,使我能夠通過他們在我的應用程序,你的情況是這樣的:這根據您當前的搜索條件

public class ApiDataCriteria{ 

    public int? RowStatus {get;set;} 
    public DateTime? Created {get;set;} 
    public DateTime? Modified {get;set;} 

} 

填充(最有可能基於UI用戶選擇),然後傳遞到我上面創建這樣的方法:

public IList<ApiData> SearchApiData(ApiDataCriteria criteria) 
{ 

     ICriteria query = _session.CreateCriteria<ApiData>(); 

     if (criteria.rowStatus.HasValue) 
     { 
      query.Add(Restrictions.Eq("RowStatus", criteria.rowStatus.Value)); 
     } 

     if (criteria.createdDate.HasValue) 
     { 
      query.Add(Restrictions.Eq("CreatedDate", criteria.createdDate.Value)); 
     } 

     return query.List<ApiData>(); 

} 

這樣,你只需要一個單一的方法,其符號即使您稍後添加更多搜索條件,ature也不會改變。