C# Nhibernate的获取和加载方法不支持会话筛选器?

C# Nhibernate的获取和加载方法不支持会话筛选器?,c#,hibernate,nhibernate,orm,fluent-nhibernate,C#,Hibernate,Nhibernate,Orm,Fluent Nhibernate,我需要在获取/加载方法上应用Nhibernate不支持的过滤器。在获取/加载时应用过滤器的技术有哪些。 我知道我可以在DefaultLoadEventListener中修改一个值。有人能推荐一些更好的技术吗?您可以使用拦截器来实现这一点。下面的代码在尝试获取对象时应用筛选条件 代码的重要部分是,重写了OnPrepareStatement方法,在该方法中,它根据给定的条件修改了fetchSQL以进行筛选。基于文本的匹配是一种相当粗糙的方法,但我希望你能理解 public class TenantI

我需要在获取/加载方法上应用Nhibernate不支持的过滤器。在获取/加载时应用过滤器的技术有哪些。
我知道我可以在DefaultLoadEventListener中修改一个值。有人能推荐一些更好的技术吗?

您可以使用拦截器来实现这一点。下面的代码在尝试获取对象时应用筛选条件

代码的重要部分是,重写了OnPrepareStatement方法,在该方法中,它根据给定的条件修改了fetchSQL以进行筛选。基于文本的匹配是一种相当粗糙的方法,但我希望你能理解

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);
        }
    }

但当我们在实体中有集合时,不会应用此筛选器。例如,我有角色的活动筛选器。我有一个用户实体,其中有一个角色集合。如果某个角色变为非活动状态,则当我获取/加载用户时,所有角色都来自数据库,包括非活动的角色。即使是这种情况,我认为仍然会触发OnPrepareStation,并且您可以修改SQL以仅加载您想要的EH。