Domanda

Per esempio, desidera inserire un controllo gridview in un ASP.NET pagina web con solo i dati necessari per il numero di righe visualizzate.Come NHibernate sostenere questo?

È stato utile?

Soluzione

ICriteria ha un SetFirstResult(int i) il metodo, che indica l'indice del primo elemento che si desidera ottenere (in pratica la prima riga di dati in pagina).

Essa ha anche un SetMaxResults(int i) il metodo, che indica il numero di righe che si desidera ottenere (cioè, la dimensione della pagina).

Per esempio, tali criteri sono oggetto ottiene i primi 10 risultati della griglia di dati:

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

Altri suggerimenti

Si può anche prendere vantaggio di il Future funzionalità in NHibernate per eseguire la query per ottenere il totale record contano i risultati effettivi in una singola query.

Esempio

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

Per ottenere il totale conteggio dei record, eseguire le operazioni seguenti:

int iRowCount = rowCount.Value;

Una buona discussione di cosa Futures dare è qui.

Da NHibernate 3 e superiori, è possibile utilizzare QueryOver<T>:

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

Si potrebbe anche voler esplicitamente ordinare i risultati come questo:

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

Quando lo spostamento dei dati, c'è un altro modo per ottenere digitato il risultato Multicriterio o tutti fa lo stesso, proprio come me ?

Grazie

Come sull'utilizzo di Linq to NHibernate come discusso in questo post del blog da Ayende?

Esempio Di Codice:

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

E qui è un dettagliato post dal NHibernate team blog Accesso Ai Dati Con NHibernate tra cui l'attuazione di paging.

Probabilmente in un GridView si desidera mostrare una fetta di dati e il numero totale di righe (conteggio delle righe) della quantità totale di dati che corrispondono alla tua query.

Si dovrebbe utilizzare un MultiQuery di inviare il Select count(*) e query .SetFirstResult(n).SetMaxResult(m) query al database in una singola chiamata.

Nota il risultato sarà una lista che contiene 2 elenchi, uno per la sezione di dati e uno per il conte.

Esempio:

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];

Suggerisco di creare una struttura specifica per affrontare l'impaginazione.Qualcosa di simile (sono un programmatore Java, ma che dovrebbe essere facile per la mappa):

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

}

Io non fornire un'implementazione, ma è possibile utilizzare i metodi suggeriti da @Jon.Ecco un buona discussione per dare un'occhiata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top