【问题标题】:Decorate an IQueryOver<T, T> using NHibernate 3.0使用 NHibernate 3.0 装饰 IQueryOver<T, T>
【发布时间】:2010-11-08 05:08:44
【问题描述】:

尝试使用一些条件逻辑来装饰 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(of Customer, ServiceTicket)。当我尝试使用 query = query idiom 进行装饰时,类型现在不匹配。

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

【问题讨论】:

  • 你有没有找到解决这个问题的方法?我遇到了同样的事情。
  • 不,我在架构的更高层更改了设计原则,以降低这一层的复杂性。这最终使这种需求消失了。我建议你也这样做。我不认为这是你想要的工具。真正看到查询对象模式的力量需要比提供的更强大的实现。

标签: nhibernate nhibernate-3


【解决方案1】:

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

【讨论】:

  • 是的,我想添加更多联接;)
  • 我的意思是我认为您不需要遍历备份 - 只需跳过覆盖查询变量并根据需要继续添加连接。
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2016-09-07
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多