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; }
}
SearchTextLog 内のカウントの合計に基づいて、上位 5 つの SearchText アイテムを選択しようとしています。現在、最初にクエリを実行して上位 5 項目を取得し、その結果を 2 番目のクエリで使用することによってのみ、これを解決できました。誰かが私に光を見せて、これら 2 つの別々のクエリを 1 つのユニットに統合する方法を教えてくれないかと思っていました。
これが私が現在持っているものです:
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 は私にとってまったく新しいものであり、まったく異なる考え方が必要です。