使用NHibernate 3.0 </t,>装饰IQueryOver <t,t =“”>

时间:2010-11-08 05:08:45

标签: nhibernate nhibernate-3

尝试使用一些条件逻辑来装饰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语句中,我打破了流畅的接口的类型安全性。根据{{​​3}},JoinQueryOver将我的查询从QueryOver(Customer,Customer)转换为QueryOver(Customer,ServiceTicket)。当我尝试使用query = query idiom进行装饰时,类型现在不匹配。

所以这里真正的问题是我从Customer对象遍历ServiceTicket关系,它改变了我的QueryOver对象的类型。 如何遍历树以便我可以继续向原始根客户对象添加内部联接?

1 个答案:

答案 0 :(得分:2)

我认为您拥有的原始IQueryOver是可变的并且将注册注册到JoinQueryOver,因此您不需要存储返回值(除非您需要从已连接的实体添加更多条件连接)。