Попытка украсить 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?
Вы когда-нибудь находили решение этой проблемы? Я сталкиваюсь с тем же. –
Нет, я изменил принцип дизайна выше в моей архитектуре, чтобы уменьшить сложность на этом уровне. Это закончилось тем, что эта потребность исчезла. Я бы порекомендовал вам сделать то же самое. Я не думаю, что это инструмент для чего вы хотите. Поистине видя мощь шаблона объектов запросов, требуется более надежная реализация, чем то, что предоставляется. –