Фильтры сеансов не поддерживаются методом Get и Load для Nhibernate?

Мне нужно применить фильтры для метода Get/Load, который Nhibernate не поддерживает. Каковы некоторые методы применения фильтров для get/load. Я знаю о том, где я могу изменить значение в DefaultLoadEventListener. Может ли кто-нибудь предложить несколько лучших методов?

1 ответ

Вы можете использовать перехватчики для достижения этого. Следующий код применит условие фильтра, когда он пытается извлечь объект.

Важным разделом кода является переопределенный метод OnPrepareStatement, в котором он изменяет SQL-фильтр для фильтрации на основе данного условия. Согласование на основе текста - довольно грубый способ сделать это, но я надеюсь, что вы поняли эту идею.

public class TenantInterceptor : ****************
 {
 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);
 }
 }

licensed under cc by-sa 3.0 with attribution.