2010-11-08 1 views
1

Попытка украсить IQueryOver с помощью некоторой условной логики. Рассмотрим следующий код, который является частным методом для объекта, представляющего поиск клиента.Украсьте IQueryOver <T, T> с помощью NHibernate 3.0

private void addCustomerCriterion<T>(IQueryOver<T, T> query) where T : Customer 
    { 
     if (!string.IsNullOrEmpty(Name)) 
      query = query 
       .Where(x => x.FirstName.ToUpper().Contains(Name.ToUpper()) || 
          x.LastName.ToUpper().Contains(Name.ToUpper())); 

     if (HasOpenTicket.HasValue) 
      query = query 
       .Inner.JoinQueryOver<ServiceTicket>(c => c.ServiceTickets) 
       .Where(t => t.StatusName == "Open") 
     } 

     if (HasOpenInvoice.HasValue) 
      query = query 
       .Inner.JoinQueryOver<Invoice>(c => c.Invoices) 
       .Where(i => i.StatusName == "Open"); 
    } 

К сожалению, это не скомпилировано. Имеет смысл, потому что во втором и третьем if-statement я нарушаю безопасность безопасного интерфейса. Согласно http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx, JoinQueryOver преобразует мой запрос из QueryOver (Customer, Customer) в QueryOver (Customer, ServiceTicket). Теперь типы не совпадают, когда я пытаюсь украсить, используя id = query query.

Таким образом, реальная проблема заключается в том, что я прошел через отношения ServiceTicket от объекта Customer и изменил тип объекта QueryOver. Как я могу вернуться назад к дереву, чтобы я мог добавлять внутренние соединения к исходному корневому объекту Customer?

+0

Вы когда-нибудь находили решение этой проблемы? Я сталкиваюсь с тем же. –

+0

Нет, я изменил принцип дизайна выше в моей архитектуре, чтобы уменьшить сложность на этом уровне. Это закончилось тем, что эта потребность исчезла. Я бы порекомендовал вам сделать то же самое. Я не думаю, что это инструмент для чего вы хотите. Поистине видя мощь шаблона объектов запросов, требуется более надежная реализация, чем то, что предоставляется. –

ответ

2

Я думаю, что исходный IQueryOver, который у вас есть, изменен и регистрирует вызов JoinQueryOver, поэтому вам не нужно сохранять возвращаемое значение (если вам не нужно добавлять дополнительные условные объединения из объединенного объекта).

+0

Да, я хотел бы добавить больше joins;) –

+0

Что я имел в виду, так это то, что я не думаю, что вам нужно вернуться назад - просто пропустите перезапись переменной запроса и продолжайте добавлять к ней присоединения по мере необходимости. – Yhrn