NHibernate筛选数据最佳实践

NHibernate筛选数据最佳实践,nhibernate,filter,nhibernate-mapping,Nhibernate,Filter,Nhibernate Mapping,我有以下情况: 用户登录,打开所有产品的概览,只能看到添加了条件的产品列表,该条件是可变的。示例:WHERE category in('catA','CatB') 管理员登录,打开所有产品的概览,他可以看到所有未应用过滤器的产品 我需要尽可能动态地进行此操作。我的数据访问类大部分时间都在使用泛型 我已经看到了,但是我的条件是非常多变的,所以我认为这不够可扩展 我们对类似的东西使用NH过滤器,效果很好。如果不需要应用任何筛选器,则可以忽略为筛选器设置任何值。我们将这些过滤器用于更基本的内容,几乎1

我有以下情况:

用户登录,打开所有产品的概览,只能看到添加了条件的产品列表,该条件是可变的。示例:
WHERE category in('catA','CatB')

管理员登录,打开所有产品的概览,他可以看到所有未应用过滤器的产品

我需要尽可能动态地进行此操作。我的数据访问类大部分时间都在使用泛型


我已经看到了,但是我的条件是非常多变的,所以我认为这不够可扩展

我们对类似的东西使用NH过滤器,效果很好。如果不需要应用任何筛选器,则可以忽略为筛选器设置任何值。我们将这些过滤器用于更基本的内容,几乎100%应用的过滤器,fx删除对象过滤器,客户端数据隔离等。不确定您要寻找的可伸缩性方面是什么

对于更高级和更复杂的过滤,我们使用一个自定义类来处理存储库根。如下所示:

 public IQueryOver<TIn, TOut> Apply(IQueryOver<TIn, TOut> query)
 {
      return query.Where(x => ... );
 }
List<string> allowedCategoriesList = new List<string>();
allowedCategoriesList.Add(...);
...
.WhereRestrictionOn(x => x.category).IsIn(allowedCategoriesList)
公共IQueryOver应用(IQueryOver查询)
{
返回查询。其中(x=>…);
}

如果您有一个与NH用法集成的IoC容器,那么类似的东西可以很容易地通用化并插入到堆栈中。我们有这些存储库操纵器,它们执行简单的where子句,还有一些生成引用域逻辑的复杂where子句,还有一些生成连接第二个表的复杂where子句,并对其进行筛选。

您可以将所有类别保存在类别列表中,并将此列表传递给查询。如果列表不为空且包含元素,则可以使用以下内容:

 public IQueryOver<TIn, TOut> Apply(IQueryOver<TIn, TOut> query)
 {
      return query.Where(x => ... );
 }
List<string> allowedCategoriesList = new List<string>();
allowedCategoriesList.Add(...);
...
.WhereRestrictionOn(x => x.category).IsIn(allowedCategoriesList)
List allowedCategoriesList=新列表();
allowedCategoriesList.Add(…);
...
.WhereRestrictionOn(x=>x.category).IsIn(allowedCategoriesList)

只有在没有任何筛选器的情况下跳过此条目才很重要(因此,您希望看到所有条目而不进行筛选),否则您将看不到一个结果。

是的,我想我可以这样做,将筛选器存储在用户的某个会话(web环境)中。过滤器最多的是表列本身,而不是联接。它工作得很好。我们的环境也是一个ASP.NET站点,我们使用Castle.Windsor的自定义
DefaultTypedFactoryComponentSelector
工厂,该工厂与过滤器属性类一起,允许我们仅使用字符串名称(来自包含硬编码过滤器名称的静态类)从容器中生成过滤器,只需调用Apply即可设置,可选择通过界面中的
void SetValue(T value)
方法设置一些上下文数据。