答案 0 :(得分:2)
尝试这样的事情
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);
}
答案 1 :(得分: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/