2011-01-06 32 views
6

tôi có phương pháp Repository này trong đó sử dụng QueryOver APIVấn đề với nHibernate biệt và phân trang

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

Tôi đã thử cả hai

.TransformUsing(Transformers.DistinctRootEntity); 

.RootCriteria.SetResultTransformer(new DistinctEntityRootTransformer()) 

Nó vít lên cả tổng số đếm (Nó trả về kết quả không phân biệt) và phân trang thực tế (Bỏ qua/Thực hiện)

Làm cách nào để khắc phục sự cố này?

Cảm ơn trước, Anders

Trả lời

3

Hãy thử một cái gì đó như thế này

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); 
} 
+3

Giải thích về lý do tại sao/làm thế nào câu trả lời của bạn là đúng có thể hữu ích, thay vì chỉ 'Dưới đây là Các Codez' – sweaver2112

1

Tôi đã có một vấn đề với là tốt này. Thứ nhất, Distinct không hoạt động, nhưng chỉ sau khi phương thức QueryOver.List.ToList() được gọi, do đó query.skip sẽ không hoạt động đúng, phân trang trên các bản sao, tạo danh sách, sau đó giảm số lượng trang của tôi vì các bản sao .

điều dễ nhất tôi tìm thấy để làm được .. chỉ cần tạo một danh sách các id độc đáo đầu tiên, sau đó làm pagination của bạn trên Id mình ..

Sau đó, trên kết quả của bạn thiết lập bạn chỉ có thể thực hiện một Id và lấy id chỉ trong tập hợp kết quả id mới được phân trang của bạn.

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

đặc biệt nhờ .. https://julianjelfs.wordpress.com/2009/04/03/nhibernate-removing-duplicates-combined-with-paging/

Các vấn đề liên quan