1

У меня есть таблица со многими записями в ней, которая может быть отфильтрована rowstatus, создана дата, modifieddate.Создайте список критериев дополнительных фильтров для извлечения записей nhibernate C#

Я использую беглый nhibernate как ORM.

Теперь запрос, который может прийти в WebAPI может быть:?

rowstatus = 0 ИЛИ rowstatus = 0 & createddate = 05-30-2013 ИЛИ createddate = 05-30-2013 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;} 

} 

заселить это согласно текущему критерию поиска (скорее всего, на основе выбора пользователя в пользовательском интерфейсе), а затем передать в метод, я создал выше, как это:

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 не изменится, даже если вы добавите больше критериев поиска позже.