Frage

Ich möchte beispielsweise ein Gridview-Steuerelement in einer ASP.NET-Webseite nur mit den Daten füllen, die für die Anzahl der angezeigten Zeilen erforderlich sind.Wie kann NHibernate dies unterstützen?

War es hilfreich?

Lösung

ICriteria hat eine SetFirstResult(int i) Methode, die den Index des ersten Elements angibt, die Sie erhalten möchten (im Grunde die erste Datenzeile in Ihrer Seite).

Es hat auch eine SetMaxResults(int i) Methode, die die Anzahl der Zeilen, die Sie (das heißt, Ihre Seitengröße).

erhalten möchten anzeigt

Zum Beispiel dieser Kriterien Objekt bekommt die ersten 10 Ergebnisse Ihrer Datenraster:

criteria.SetFirstResult(0).SetMaxResults(10);

Andere Tipps

Sie können auch nutzen die Futures in NHibernate verfügen über die Abfrage auszuführen die gesamte Anzahl der Datensätze sowie die tatsächlichen Ergebnisse in einer einzigen Abfrage zu erhalten.

Beispiel:

 // Get the total row count in the database.
var rowCount = this.Session.CreateCriteria(typeof(EventLogEntry))
    .Add(Expression.Between("Timestamp", startDate, endDate))
    .SetProjection(Projections.RowCount()).FutureValue<Int32>();

// Get the actual log entries, respecting the paging.
var results = this.Session.CreateCriteria(typeof(EventLogEntry))
    .Add(Expression.Between("Timestamp", startDate, endDate))
    .SetFirstResult(pageIndex * pageSize)
    .SetMaxResults(pageSize)
    .Future<EventLogEntry>();

Um die Gesamtdatenanzahl zu erhalten, haben Sie folgende Möglichkeiten:

int iRowCount = rowCount.Value;

Eine gute Diskussion darüber, was Futures Sie geben, ist hier .

Von NHibernate 3 und höher, können Sie QueryOver<T> verwenden:

var pageRecords = nhSession.QueryOver<TEntity>()
            .Skip((PageNumber - 1) * PageSize)
            .Take(PageSize)
            .List();

Sie können auch wollen ausdrücklich Ihre Ergebnisse wie folgt bestellen:

var pageRecords = nhSession.QueryOver<TEntity>()
            .OrderBy(t => t.AnOrderFieldLikeDate).Desc
            .Skip((PageNumber - 1) * PageSize)
            .Take(PageSize)
            .List();
public IList<Customer> GetPagedData(int page, int pageSize, out long count)
        {
            try
            {
                var all = new List<Customer>();

                ISession s = NHibernateHttpModule.CurrentSession;
                IList results = s.CreateMultiCriteria()
                                    .Add(s.CreateCriteria(typeof(Customer)).SetFirstResult(page * pageSize).SetMaxResults(pageSize))
                                    .Add(s.CreateCriteria(typeof(Customer)).SetProjection(Projections.RowCountInt64()))
                                    .List();

                foreach (var o in (IList)results[0])
                    all.Add((Customer)o);

                count = (long)((IList)results[1])[0];
                return all;
            }
            catch (Exception ex) { throw new Exception("GetPagedData Customer da hata", ex); }
      }

Wenn Daten Paging gibt es eine andere Art und Weise eingegeben Ergebnis von mehrkriteriellen zu bekommen oder jeder tut das gleiche wie ich?

Danke

Wie wäre es Linq zu NHibernate wie in diese Blog-Post von Ayende?

Code-Beispiel:

(from c in nwnd.Customers select c.CustomerID)
        .Skip(10).Take(10).ToList(); 

Und hier ist eine detaillierte Post von dem NHibernate Team-Blog auf Data Access Mit NHibernate einschließlich Paging zu implementieren.

Die meisten wahrscheinlich in einem Gridview Sie ein Stück Daten zeigen wollen und die Gesamtanzahl der Zeilen (rowcount) der Gesamtmenge der Daten, die Ihrer Suchanfrage entsprechen.

Sie sollten eine MultiQuery verwenden sowohl die SELECT COUNT (*) Abfrage und .SetFirstResult (n) .SetMaxResult (m) Anfragen an die Datenbank in einem einzigen Aufruf zu senden.

das Ergebnis Hinweis wird eine Liste, die zwei Listen, eine für die Datenscheibe und einen für die Zählung hält.

Beispiel:

IMultiQuery multiQuery = s.CreateMultiQuery()
    .Add(s.CreateQuery("from Item i where i.Id > ?")
            .SetInt32(0, 50).SetFirstResult(10))
    .Add(s.CreateQuery("select count(*) from Item i where i.Id > ?")
            .SetInt32(0, 50));
IList results = multiQuery.List();
IList items = (IList)results[0];
long count = (long)((IList)results[1])[0];

Ich schlage vor, dass Sie eine bestimmte Struktur erstellen mit Paginierung beschäftigen. So etwas wie (Ich bin ein Java-Programmierer, aber das sollte einfach abzubilden):

public class Page {

   private List results;
   private int pageSize;
   private int page;

   public Page(Query query, int page, int pageSize) {

       this.page = page;
       this.pageSize = pageSize;
       results = query.setFirstResult(page * pageSize)
           .setMaxResults(pageSize+1)
           .list();

   }

   public List getNextPage()

   public List getPreviousPage()

   public int getPageCount()

   public int getCurrentPage()

   public void setPageSize()

}

Ich habe nicht eine Implementierung liefern, aber Sie die Methoden vorgeschlagen verwenden könnten? @ Jon . Hier ein gute Diskussion für Sie einen Blick zu nehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top