gpt4 book ai didi

c# - 限制收集以仅检索只读实体的最近条目

转载 作者:行者123 更新时间:2023-11-30 18:28:21 24 4
gpt4 key购买 nike

User 实体可以有数千个 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; } }
}
}

那么我该如何指定呢?我想我可以使用映射覆盖?

我知道我可以通过单独的查询来实现,但是可以通过实体映射来实现吗?

另外我想知道是否有可能为非只读实体做一些我可以修改操作集合的事情?

更新

我试过

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

现在它在内部抛出空引用异常

в FluentNHibernate.Utils.ExpressionToSql.Convert(对象值) в FluentNHibernate.Utils.ExpressionToSql.Convert(ConstantExpression 表达式) в FluentNHibernate.Utils.ExpressionToSql.Convert[T](Expression`1 expression, UnaryExpression body)

最佳答案

过滤映射集合的一般方法有两种。

第一个有点死板,固定,在一个映射定义的where=""子句中:

第二个可能真正适合这种情况的是称为过滤器的动态版本:

NHibernate adds the ability to pre-define filter criteria and attach those filters at both a class and a collection level. A filter criteria is the ability to define a restriction clause very similiar to the existing "where" attribute available on the class and various collection elements. Except these filter conditions can be parameterized. The application can then make the decision at runtime whether given filters should be enabled and what their parameter values should be. Filters can be used like database views, but parameterized inside the application....

fluent 中的实现如下所示:

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

另见:

关于c# - 限制收集以仅检索只读实体的最近条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25161353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com