Я хочу сделать своеобразную «новостную ленту» в приложении моей компании.В этом сценарии действия пользователя будут генерировать «активность» различных видов, а другие пользователи будут видеть в своей «ленте новостей».
Однако «активность» относится не ко всем пользователям, и для определенияВ связи с этим у нас сложный фрагмент кода.
Вот мой класс Activity
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 новостей, которые видны Пользователю.Но так как таблица Activity будет довольно большой, а производительность - это проблема, я хочу сделать лучший совет об этом.
Что я собираюсь сделать, это получить 25 последних Activity и проверить, заполняем ли мысписок, чтобы показать пользователю.Например, если пользователю видны только 5 действий, я получу еще 25 действий и т. Д.
IList<Activity> resultList = session.CreateCriteria(typeof(Activity))
.SetMaxResults(25)
.AddOrder(Order.Desc("Id"))
.List<Activity>();
Я хочу узнать, получу ли я весь список, упорядоченный по идентификатору, и проверить один из них поодин, если он виден пользователю, будет ли 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;
}
}
EDIT : Вот ActivityMapping для модели Activity.
public class ActivityMap : ClassMap<Activity>
{
public ActivityMap()
{
Id(x => x.Id);
Map(x => x.Type).CustomType(typeof(Int32));
References(x => x.User).Nullable();
}
}