由于在这种过滤器情况下查询替换似乎不是一个可用的解决方案,您可能会选择查询拦截器(这里是一个非常粗略的实现):
public class BooleanInterceptor : EmptyInterceptor, IInterceptor
{
public string TrueToken { get; set; }
public string FalseToken { get; set; }
NHibernate.SqlCommand.SqlString IInterceptor.OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
{
return sql.Replace("{TrueToken}", TrueToken).Replace("{FalseToken}", FalseToken);
}
}
您的映射将是where="BProp = {TrueToken}"
它会像这样使用
var interceptor = new BooleanInterceptor ();
using (var session = sessionFactory.OpenSession(interceptor))
{
interceptor.FalseToken = "0"; // this replacement value should be taken from a config file
interceptor.TrueToken = "1"; // see above
// your code here
session.Close();
}
我敢打赌有更好的解决方案,但我希望这会有所帮助
-------------------------- 上一个答案
我用来在我的 NHibernate 配置中插入查询替换,像这样
var cfg = new Configuration();
cfg.Properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
.
cfg.Properties.Add("query.substitutions", "true 1, false 0");
.
我想你可以有你的 xml 映射,where="BProp = true"
只需为 query.substitions 插入 cfg 属性,具体取决于方言是 MsSql / Oracle 还是 PosgresSQL