NHibernate - Paging mit ICriteria und optionalen ICriteria-Aufrufen
Ich möchte so etwas tun ...
return GetSession()
.ToPagedList<Employee>(page, pageSize,
x=> x.SetFetchMode(DomainModelHelper.GetAssociationEntityNameAsPlural<Team>(), FetchMode.Eager));
Aber ich weiß nicht, wie ich das weitergeben sollFunc<ICriteria,ICriteria>
in dasISession
oderICriteria
.
Ich habe eine Standard-Paging-Erweiterungsmethode und diese Erweiterungsmethode hat eine Überladung, bei der ich zusätzliche ICriteria-Methoden übergeben kann, damit ich zusätzlich das @ einrichten kanFetchMode
oder etwas anderes
Erweiterungsmethode:
public static class CriteriaExtensions
{
public static PagedList<T> ToPagedList<T>(this ISession session, int page, int pageSize) where T : Entity
{
var totalCount = TotalCount<T>(session);
return new PagedList<T>(session.CreateCriteria<T>()
.SetFirstResult(pageSize * (page - 1))
.SetMaxResults(pageSize * page)
.Future<T>().ToList(), page, pageSize, totalCount);
}
public static PagedList<T> ToPagedList<T>(this ISession session, int page, int pageSize, Func<ICriteria, ICriteria> action) where T : Entity
{
var totalCount = TotalCount<T>(session);
...
}
private static int TotalCount<T>(ISession session) where T : Entity
{
return session.CreateCriteria<T>()
.SetProjection(Projections.RowCount())
.FutureValue<Int32>().Value;
}
}
bearbeiten
Ohne eine Überlastung würde es so aussehen:
return GetSession()
.CreateCriteria<Employee>()
.SetFetchMode(DomainModelHelper.GetAssociationEntityNameAsPlural<Team>(), FetchMode.Eager)
.ToPagedList<Employee>(page, pageSize);
Erweiterungsmethode:
public static class CriteriaExtensions
{
public static PagedList<T> ToPagedList<T>(this ICriteria criteria, int page, int pageSize) where T : Entity
{
var copiedCriteria = (ICriteria) criteria.Clone();
var totalCount = TotalCount(criteria);
return new PagedList<T>(copiedCriteria
.SetFirstResult(pageSize * (page - 1))
.SetMaxResults(pageSize * page)
.Future<T>().ToList(), page, pageSize, totalCount);
}
private static int TotalCount(ICriteria criteria)
{
return criteria
.SetProjection(Projections.RowCount())
.FutureValue<Int32>().Value;
}
}
Die Linievar copiedCriteria = (ICriteria) criteria.Clone();
riecht hier, aber ich weiß nicht, wie ich das ändern soll.
Welchen Ansatz würden Sie vorschlagen?