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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage