簡體   English   中英

限制集合以僅檢索只讀實體的最近條目

[英]Limit collection to retrieve only recent entries for readonly entity

用戶實體可以擁有數千個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實體做一些我可以修改操作的集合?

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引用異常

FluentNHibernate.Utils.ExpressionToSql.Convert(Object value)•FluentNHibernate.Utils.ExpressionToSql.Convert(ConstantExpression expression)•FluentNHibernate.Utils.ExpressionToSql.Convert [T](Expression`1表達式,UnaryExpression正文)

有兩種通用方法可以過濾映射的集合。

第一個是有點僵硬,固定,在映射中定義where=""子句:

第二種,也許在這種情況下非常合適,是名為filter的動態版本:

NHibernate增加了預定義過濾條件的能力,並在類和集合級別附加這些過濾器。 過濾條件是能夠定義與類和各種集合元素上現有的“where”屬性非常相似的限制子句。 除了這些過濾條件可以參數化。 然后,應用程序可以在運行時決定是否應該啟用給定的過濾器以及它們的參數值應該是什么。 過濾器可以像數據庫視圖一樣使用,但在應用程序內部進行參數化....

流利的實現看起來像這樣:

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

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM