会社のアプリケーションで一種の「ニュースフィード」を作りたいです。シナリオでは、ユーザーアクションはさまざまな種類の「アクティビティ」を生成し、他のユーザーは「ニュースフィード」に表示されます。
ただし、「アクティビティ」はすべてのユーザーに関連しているわけではなく、関係を判断するために、複雑なコードがあります。
これが私のアクティビティクラスです
public class Activity: IActivity
{
public virtual int Id { get; set; }
public virtual ActivityType Type { get; set; }
public virtual User User { get; set; }
public virtual bool IsVisibleToUser(User userLook)
{
// Complex business calculation etc.
return true;
}
}
ユーザーに表示される最新の10のニュースを取得したい。ただし、アクティビティテーブルは非常に大きくなり、パフォーマンスが問題になるため、ベストプラクティスを実行したいと思います。
私がやろうとしていることは、最後の25のアクティビティを取得し、ユーザーに表示するリストを埋めるかどうかを確認することです。たとえば、ユーザーに表示されるアクティビティが5つだけの場合、さらに25のアクティビティを取得します。
IList<Activity> resultList = session.CreateCriteria(typeof(Activity))
.SetMaxResults(25)
.AddOrder(Order.Desc("Id"))
.List<Activity>();
リスト全体をId順に並べて、ユーザーに表示されているかどうかを1つずつ確認した場合、NHibernateは使用するオブジェクトのみをロードするかどうかを知りたいですか?
IList<Activity> resultList = session.CreateCriteria(typeof(Activity))
.AddOrder(Order.Desc("Id"))
.List<Activity>();
int count = 0;
foreach( Activity act in resultList){
if (act.IsVisible(CurrentUser)){
count++;
// Do something with act
if (count == 10)
break;
}
}
編集:これがアクティビティモデルのActivityMappingです。
public class ActivityMap : ClassMap<Activity>
{
public ActivityMap()
{
Id(x => x.Id);
Map(x => x.Type).CustomType(typeof(Int32));
References(x => x.User).Nullable();
}
}