用户实体可以拥有数千个UserOperations。有时我不想检索(对于只读实体)所有这些但仅“最近10次或未完成”。
public class SimpleForm
{
public class User : EntityBase
{
// ...
private ISet<UserOperation> _recentOperations = new HashedSet<UserOperation>();
public virtual ISet<UserOperation> RecentOperations { get { return _recentOperations; } set { _recentOperations = value; } }
}
}
那我怎么指定呢?我想我可以使用映射覆盖?
我知道我可以使用单独的查询进行此操作,但可以通过实体映射来完成吗?
另外我想知道是否有可能为非readonly实体做一些我可以修改操作集合的实体?
更新
我尝试使用
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);
现在它在
中抛出空引用异常FFluentNHibernate.Utils.ExpressionToSql.Convert(Object value) FluentNHibernate.Utils.ExpressionToSql.Convert(ConstantExpression表达式) F FluentNHibernate.Utils.ExpressionToSql.Convert [T](表达式`1表达式,UnaryExpression体)
答案 0 :(得分:0)
如何过滤映射集合有两种常用方法。
第一个在映射定义where=""
子句中有点僵硬,固定:
.Where(bool expr)
或.Where(Sql statement string)
第二种,也许在这种情况下非常合适,是名为filter的动态版本:
NHibernate增加了预定义过滤条件的能力,并在类和集合级别附加这些过滤器。过滤条件是能够定义一个非常类似于现有的限制条款&#34;其中&#34;类和各种集合元素上可用的属性。除了这些过滤条件可以参数化。然后,应用程序可以在运行时决定是否应该启用给定的过滤器以及它们的参数值应该是什么。过滤器可以像数据库视图一样使用,但在应用程序内部进行参数化....
流利的实现看起来像这样:
public class RecentFilter : FilterDefinition
{
public RecentFilter()
{
WithName("RecentFilter")
.WithCondition("( :EndedAtDate IS NULL OR EndedAt < :EndedAtDate )")
.AddParameter("EndedAtDate",NHibernate.NHibernateUtil.DateTime);
}
}
这是过滤器,这是它在流畅映射中的用法:
mapping
.HasMany(x => x.RecentOperations)
...
.ApplyFilter<RecentFilter>();
在运行时,我们可以在ISession级别打开/关闭过滤器:
session.EnableFilter("RecentFilter")
.SetParameter("EndedAtDate",DateTime.Now.AddDays(-15));
另见: