私はついに素晴らしい解決策を見つけました(フィルターを使用)。Castle AR には NHibernate フィルターにマッピングするためのネイティブ API がないため、この部分はほとんど文書化されていませんでした。だからここに行きます。
この例のフィルターは、ActiveRecord でどのような種類のクエリを使用しても、1 年以上前のニュースを取得しないようにします。これについては、おそらくもっと実用的なアプリケーションを考えることができます。
まず、ActiveRecord「ニュース」を作成します。
ActiveRecordStarter を初期化する前に、次のコードを使用します。
ActiveRecordStarter.MappingRegisteredInConfiguration += MappingRegisteredInConfiguration;
Castle.ActiveRecord.Framework.InterceptorFactory.Create = () => { return new EnableFiltersInterceptor(); };
次に、不足している関数とクラスを追加します。
void MappingRegisteredInConfiguration(Castle.ActiveRecord.Framework.ISessionFactoryHolder holder)
{
var cfg = holder.GetConfiguration(typeof (ActiveRecordBase));
var typeParameters = new Dictionary<string, IType>
{
{"AsOfDate", NHibernateUtil.DateTime}
};
cfg.AddFilterDefinition(new FilterDefinition("Latest", "", typeParameters));
var mappings = cfg.CreateMappings(Dialect.GetDialect(cfg.Properties));
var newsMapping = cfg.GetClassMapping(typeof (News));
newsMapping.AddFilter("Latest", ":AsOfDate <= Date");
}
public class EnableFiltersInterceptor : EmptyInterceptor
{
public override void SetSession(ISession session)
{
session.EnableFilter("Latest").SetParameter("AsOfDate", DateTime.Now.AddYears(-1));
}
}
そして出来上がり!FindAll()、DeleteAll()、FindOne()、Exists() などのニュースに関するクエリは、1 年以上前のエントリには触れません。