尝试使用一些条件逻辑来装饰 IQueryOver。考虑以下代码,它是代表客户搜索的对象的私有方法。
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 语句中,我打破了流畅接口的类型安全性。根据http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx,JoinQueryOver 将我的查询从 QueryOver(of Customer, Customer) 转换为 QueryOver (客户,ServiceTicket)。当我尝试使用 query = query idiom 进行装饰时,类型现在不匹配。
所以这里真正的问题是我已经从 Customer 对象遍历到 ServiceTicket 关系,它改变了我的 QueryOver 对象的类型。如何遍历树,以便继续向原始根客户对象添加内部连接?