我需要在Nhibernate不支持的Get / Load方法上应用过滤器。在get / load上应用过滤器有哪些技巧。 我知道我可以在DefaultLoadEventListener中修改值。任何人都可以建议一些更好的技术吗?
答案 0 :(得分:0)
您可以使用拦截器来实现此目的。以下代码在尝试获取对象时应用过滤条件。
代码的重要部分是,重写了OnPrepareStatement方法,它根据给定条件更改了要提取的提取SQL。基于文本的匹配是相当粗略的方法,但我希望你能得到这个想法。
public class TenantInterceptor : EmptyInterceptor
{
private ISession _session;
public override void SetSession(ISession session)
{
_session = session;
base.SetSession(session);
}
public override object GetEntity(string entityName, object id)
{
object entity = base.GetEntity(entityName, id);
if (entity != null && entity.GetType().IsAssignableFrom(typeof(User)))
{
var filter = _session.GetEnabledFilter("Tenant") as FilterImpl;
if (filter != null)
{
var filterValue = filter.Parameters["name"];
var user = entity as User;
if (!user.Tenant.Equals(filterValue))
return null;
}
}
return entity;
}
public override SqlString OnPrepareStatement(SqlString sql)
{
if (sql.ToString().EndsWith("FROM \"User\" user0_ WHERE user0_.Id=?"))
{
var filter = _session.GetEnabledFilter("Tenant") as FilterImpl;
if (filter != null)
{
var filterValue = filter.Parameters["name"];
sql = sql.Append(string.Format(" And user0_.Tenant = '{0}'",filterValue));
}
}
return base.OnPrepareStatement(sql);
}
}