NHibernate Criteria按另一个表中的groupid和itemid的总和选择项目

ctr*_*usb 4 nhibernate aggregate criteria nhibernate-projections

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; }
}
Run Code Online (Sandbox Code Playgroud)

我试图根据SearchTextLog中的计数总和选择前5个SearchText项.目前我只能通过首先执行查询来获取前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>();
Run Code Online (Sandbox Code Playgroud)

编辑:

哦不,我刚刚意识到我目前的解决方案将失去结果的重要顺序.所以我肯定要合并查询.: - /

编辑:

我也尝试了双向映射以允许以下语句,但是,我无法让它返回SearchText项.它只是抱怨SearchText属性不在分组中.

return Session.CreateCriteria<SearchText>()
                .CreateAlias("SearchTextLogs", "stl")
                .AddOrder(Order.Desc(Projections.Sum("stl.SearchCount")))
                .SetMaxResults(topSearchLimit)        
                .SetResultTransformer(Transformers.AliasToEntityMap)
                .List<SearchText>();
Run Code Online (Sandbox Code Playgroud)

请原谅我的无知,但Nhibernate对我来说是全新的,需要一种完全不同的思维方式.

ctr*_*usb 14

好吧,我想我已经找到了解决方案.

根据我的问题我的原始解决方案将无法工作,因为NHibernate还不支持按属性执行分组而不将其添加到select子句的功能(请参阅:链接文本).

然而,在愚弄时,我遇到了一些名为ResultTransformers的酷炫事物.使用AliasToBean结果转换器Nhibernate将自动将我给每个投影项的别名映射到我指定的类型中的相同名称的属性.我只是指定了我的SearchText对象(但是,我必须为sum投影项添加额外的TotalSearchCount属性).它完美地填充了我的对象并将它们归还.

return Session.CreateCriteria(typeof(SearchTextLog))
            .CreateAlias("SearchText", "st")
            .SetProjection(Projections.ProjectionList()
                                .Add(Projections.Alias(Projections.GroupProperty("st.Id"), "Id"))
                                .Add(Projections.Alias(Projections.GroupProperty("st.Text"), "Text"))
                                .Add(Projections.Alias(Projections.Sum("SearchCount"), "TotalSearchCount")))
            .SetMaxResults(topSearchLimit)
            .AddOrder(Order.Desc("TotalSearchCount"))
            .SetResultTransformer(Transformers.AliasToBean(typeof(SearchText)))
            .List<SearchText>();
Run Code Online (Sandbox Code Playgroud)

我很惊讶这不容易做到.我花了大约4到5个小时的时间进行研究并开发出来.希望通过越来越多的经验,我的NHibernate体验将变得更轻松.

我希望这有助于其他人!