【问题标题】:Problem with nHibernate Distinct and pagingnHibernate Distinct 和分页的问题
【发布时间】:2011-06-04 20:33:30
【问题描述】:

我有这个使用 QueryOver API 的存储库方法

    public IList<Message> ListMessagesBy(string text, IList<Tag> tags, int pageIndex, out int count, out int pageSize)
    {
        pageSize = 10;
        var likeString = string.Format("%{0}%", text);
        var query = session.QueryOver<Message>()
            .Where(Restrictions.On<Message>(m => m.Text).IsLike(likeString) ||
            Restrictions.On<Message>(m => m.Fullname).IsLike(likeString));

        if (tags.Count > 0)
        {
            var tagIds = tags.Select(t => t.Id).ToList();
            query
                .JoinQueryOver<Tag>(m => m.Tags)
                .WhereRestrictionOn(t => t.Id).IsInG(tagIds)
                .TransformUsing(Transformers.DistinctRootEntity);
        }                        

        count = 0;
        if(pageIndex < 0)
        {
            count = query.ToRowCountQuery().FutureValue<int>().Value;
            pageIndex = 0;
        }
        return query.OrderBy(m => m.Created).Desc.Skip(pageIndex * pageSize).Take(pageSize).List();
    }

我都试过了

.TransformUsing(Transformers.DistinctRootEntity);

.RootCriteria.SetResultTransformer(new DistinctEntityRootTransformer())

它搞砸了总计数(它返回的结果没有区别)和实际分页(跳过/采取)

我该如何解决这个问题?

提前致谢,安德斯

【问题讨论】:

    标签: c# hibernate distinct queryover


    【解决方案1】:

    试试这样的

    public IPagedList<Client> Find(int pageIndex, int pageSize)
    {
        Client clientAlias = null;
    
        var query = Session.QueryOver<Client>(() => clientAlias)
    
            .Select(
                Projections.Distinct(
                    Projections.ProjectionList()
                        .Add(Projections.Property<Client>(x => x.Id).As("Id"))
                        .Add(Projections.Property<Client>(x => x.Name).As("Name"))
                        .Add(Projections.Property<Client>(x => x.Surname).As("Surname"))
                        .Add(Projections.Property<Client>(x => x.GivenName).As("GivenName"))
                        .Add(Projections.Property<Client>(x => x.EmailAddress).As("EmailAddress"))
                        .Add(Projections.Property<Client>(x => x.MobilePhone).As("MobilePhone"))
                )
            )
            .TransformUsing(Transformers.AliasToBean<Client>())
    
            .OrderBy(() => clientAlias.Surname).Asc
            .ThenBy(() => clientAlias.GivenName).Asc;
    
        var count = query
            .ToRowCountQuery()
            .FutureValue<int>();
    
        return query
            .Take(pageSize)
            .Skip(Pagination.FirstResult(pageIndex, pageSize))
            .List<Client>()
            .ToPagedList(pageIndex, pageSize, count.Value);
    }
    

    【讨论】:

    • 解释您的答案为何/如何正确可能会有所帮助,而不仅仅是“这里是 The Codez”
    【解决方案2】:

    我也有这个问题。首先 Distinct 确实有效,但仅在调用 QueryOver.List.ToList() 方法之后,因此 query.skip 无法正常工作,对重复项进行分页,创建列表,然后由于重复项而减少我的分页量.

    我发现做的最简单的事情是.. 只需先创建一个唯一 ID 列表,然后对 ID 本身进行分页..

    然后在您的结果集上,您可以简单地执行 Id 并仅在新分页的 id 结果集中检索 id。

    //Create your query as usual.. apply criteria.. do what ever you want.
    
    //Get a unique set of ids from the result set.
    var idList = query.
    .Select(x => x.Id)
    .List<long>().Distinct().ToList();
    
    //Do your pagination here over those ids
    List<long> pagedIds = idList.Skip(0).Take(10).ToList();
    
    //Here what used to be non distinct resultset, now is..
    List<T> resultquery.Where(() => 
    item.Id.IsIn(pagedIds))
    .List<Person>()
    .ToList();
    

    特别感谢..https://julianjelfs.wordpress.com/2009/04/03/nhibernate-removing-duplicates-combined-with-paging/

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2021-01-30
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      相关资源
      最近更新 更多