public class SearchText
{
public virtual int Id { get; set; }
public virtual string Text { get; set; }
}
public class SearchTextLog
{
public virtual int Id { get; set; }
public virtual SearchText SearchText { get; set; }
public virtual User User { get; set; }
public virtual int SearchCount { get; set; }
public virtual DateTime LastSearchDate { get; set; }
}
Я пытаюсь выбрать первые 5 элементов SearchText на основе суммы их количества в SearchTextLog.В настоящее время мне удалось решить эту проблему, сначала выполнив запрос, чтобы получить первые 5 элементов, а затем используя результат во втором запросе.Мне было интересно, если бы кто-то мог показать мне свет и научить меня, как я могу объединить эти два отдельных запроса в единый блок.
Вот что у меня сейчас:
var topSearchCriteria = Session.CreateCriteria(typeof (SearchTextLog))
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("SearchText.Id"))
.Add(Projections.Alias(Projections.Sum("SearchCount"), "SearchCount")))
.AddOrder(Order.Desc("SearchCount"))
.SetMaxResults(topSearchLimit)
.List<int>();
return Session.CreateCriteria<SearchText>()
.Add(Restrictions.In("Id", topSearchCriteria.ToArray()))
.List<SearchText>();
Изменить:
О нет, я только что понял, что мое текущее решение потеряет важный порядок результатов.Так что мне определенно придется включить запросы.: - /
Редактировать:
Я также попытался использовать двунаправленное сопоставление, чтобы разрешить следующее утверждение, однако не могу заставить его вернуть элементы SearchText.Он просто жалуется, что свойства SearchText не входят в группу.
return Session.CreateCriteria<SearchText>()
.CreateAlias("SearchTextLogs", "stl")
.AddOrder(Order.Desc(Projections.Sum("stl.SearchCount")))
.SetMaxResults(topSearchLimit)
.SetResultTransformer(Transformers.AliasToEntityMap)
.List<SearchText>();
Извините, я не знаю, но Nhibernate совершенно новый для меня и требует совершенно другого мышления.