C#学习教程:限制集合仅检索只读实体的最近条目分享


限制集合仅检索只读实体的最近条目

用户实体可以拥有数千个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=""子句:

第二种,也许在这种情况下非常合适,是名为filter的动态版本:

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)); 

也可以看看:

上述就是C#学习教程:限制集合仅检索只读实体的最近条目分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/959924.html

发表评论

邮箱地址不会被公开。 必填项已用*标注