NHibernate过滤数据最佳实践

时间:2013-02-20 09:43:58

标签: nhibernate filter nhibernate-mapping

我有以下情况:

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

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

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

我见过filters,但我的情况变化很大,所以我认为这不够灵活。

2 个答案:

答案 0 :(得分:2)

我们使用NH过滤器来做类似的事情,它工作正常。如果不需要应用过滤器,则可以省略为过滤器设置任何值。我们将这些过滤器用于更基本的东西,几乎100%的时间应用的过滤器,fx删除的对象过滤器,客户端数据隔离等等。不确定您正在寻找什么可伸缩性方面?

对于更高级别和复杂的过滤,我们使用操作存储库根目录的自定义类。如下所示:

 public IQueryOver<TIn, TOut> Apply(IQueryOver<TIn, TOut> query)
 {
      return query.Where(x => ... );
 }

如果你有一个与你的NH使用集成的IoC容器,这样的东西可以很容易地推广并插入你的堆栈。我们有这些存储库操纵器,它们执行简单的where子句,以及生成复杂where子句的其他子句,这些子句引用域逻辑,而其他子句连接第二个表并对其进行过滤。

答案 1 :(得分:0)

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

List<string> allowedCategoriesList = new List<string>();
allowedCategoriesList.Add(...);
...
.WhereRestrictionOn(x => x.category).IsIn(allowedCategoriesList)

如果您没有任何过滤器(因此,您希望查看所有条目而不进行过滤),则跳过此条目非常重要,否则您将看不到单个结果。