如何覆盖NHibernate的类映射Where子句?

时间:2013-08-21 13:24:50

标签: c# .net vb.net nhibernate nhibernate-mapping

我有一个NHibernate映射,如下所示:

<class name="Customer" table="Customer" where="Region=0">
    ...
</class>

我无法在不严重影响应用程序的其他区域的情况下更改此映射。

有没有办法可以查询不在0区的客户,避免NHibernate在所有SQL查询中附加(where Region=0)

2 个答案:

答案 0 :(得分:2)

未经测试,但您可以试试拦截器:

public class SqlRegionInterceptor : EmptyInterceptor, IInterceptor
{

    NHibernate.SqlCommand.SqlString IInterceptor.OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
    {
        return sql.Replace("Region=0", "Region<>0");
    }
}

然后当您需要检索非Region = 0的客户时:

var interceptor = new SqlRegionInterceptor ();
using (var session = sessionFactory.OpenSession(interceptor))
{
    var customers = session.QueryOver<Customer>.List();
    ...
    session.Close();
}

处理复杂查询时要小心使用。您可能很快就会最终更换不需要的SQL部件。 请注意,这不会检索具有NULL Region的Customer。

答案 1 :(得分:0)

在您需要来自所有地区的客户的方法中添加OR子句

OR Region <> 0

技术上相当于吸引所有地区的客户。