代码之家  ›  专栏  ›  技术社区  ›  ctrlplusb

NHibernate条件按groupby和另一个表中itemid的总和选择项

  •  4
  • ctrlplusb  · 技术社区  · 16 年前
    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个搜索文本项。目前,我只能通过首先执行一个查询来获取前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对我来说是全新的,需要一种完全不同的思维方式。

    2 回复  |  直到 16 年前
        1
  •  14
  •   ctrlplusb    16 年前

    好吧,我想我已经想出了解决办法。

    根据我的问题,我原来的解决方案将不起作用,因为NHibernate还不支持在不将其添加到select子句的情况下按属性进行分组的功能(请参见: link text ).

    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>();
    

        2
  •  1
  •   Jaguar    16 年前

    这不管用吗?

    var critterRes = Session.CreateCriteria(typeof (SearchTextLog))
                .SetProjection(Projections.ProjectionList()
                                .Add(Projections.GroupProperty("SearchText"))
                                .Add(Projections.Property("SearchText"))
                                .Add(Projections.Alias(Projections.Sum("SearchCount"), "SearchCount")))
                .AddOrder(Order.Desc("SearchCount"))
                .SetMaxResults(topSearchLimit)
                .List<SearchText>()