限制集合仅检索只读实体的最近条目
用户实体可以拥有数千个UserOperations。 有时我不想检索(对于只读实体)所有这些,但仅“最近10次或未完成”。
public class SimpleForm { public class User : EntityBase { // ... private ISet _recentOperations = new HashedSet(); public virtual ISet RecentOperations { get { return _recentOperations; } set { _recentOperations = value; } } } }
那我怎么指定它呢? 我想我可以使用映射覆盖?
我知道我可以通过单独的查询来实现这一点但是可以通过实体映射完成吗?
另外我想知道是否有可能为非readonly实体做一些我可以修改操作的集合?
UPDATE
我试着用
DateTime dateTime = (DateTime.UtcNow - TimeSpan.FromDays(15)); mapping.HasMany(x => x.RecentOperations) .Where(x => x.EndedAt == null || x.EndedAt < dateTime);
但它说“无法将表达式转换为SQL”。
我用它替换了它
mapping.HasMany(x => x.RecentOperations) .Where(x => x.EndedAt == null);
现在它在里面抛出null引用exception
FluentNHibernate.Utils.ExpressionToSql.Convert(Object value)•FluentNHibernate.Utils.ExpressionToSql.Convert(ConstantExpression expression)•FluentNHibernate.Utils.ExpressionToSql.Convert [T](Expression`1表达式,UnaryExpression正文)
有两种通用方法可以过滤映射的集合。
第一个是有点僵硬,固定,在映射中定义where=""
子句:
- 6.2。 映射集合 (…以流利
.Where(bool expr)
或.Where(Sql statement string)
第二种,也许在这种情况下非常合适,是名为filter的动态版本:
- 18.1。 NHibernatefilter
NHibernate增加了预定义过滤条件的能力,并在类和集合级别附加这些filter。 过滤条件是能够定义与类和各种集合元素上现有的“where”属性非常相似的限制子句。 除了这些过滤条件可以参数化。 然后,应用程序可以在运行时决定是否应该启用给定的filter以及它们的参数值应该是什么。 filter可以像数据库视图一样使用,但在应用程序内部进行参数化….
流利的实现如下所示:
public class RecentFilter : FilterDefinition { public RecentFilter() { WithName("RecentFilter") .WithCondition("( :EndedAtDate IS NULL OR EndedAt < :EndedAtDate )") .AddParameter("EndedAtDate",NHibernate.NHibernateUtil.DateTime); } }
这是filter,这是它在流畅映射中的用法:
mapping .HasMany(x => x.RecentOperations) ... .ApplyFilter();
在运行时,我们可以在ISession级别打开/关闭filter:
session.EnableFilter("RecentFilter") .SetParameter("EndedAtDate",DateTime.Now.AddDays(-15));
也可以看看:
- 具有流畅的nHibernate自动化的属性filter
- 使用Fluent Nhibernate定义NHibernatefilter的语法?
- 是否可以使用NHibernatefilter来过滤引用?