Pregunta

Por ejemplo, quiero rellenar un control gridview en un ASP.NET la página web con sólo los datos necesarios para el # de filas mostradas.¿Cómo puede NHibernate apoyar esto?

¿Fue útil?

Solución

ICriteria tiene un SetFirstResult(int i) el método, que indica el índice del primer elemento que se desea obtener (básicamente la primera fila de datos en su página).

También tiene un SetMaxResults(int i) el método, que indica el número de filas que desea obtener (es decir, el tamaño de página).

Por ejemplo, este criterio objeto es el primero 10 resultados de su cuadrícula de datos:

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

Otros consejos

También puede tomar ventaja de los Futuros característica en NHibernate para ejecutar la consulta para obtener el total de número de registro, así como los resultados reales en una sola consulta.

Ejemplo

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

Para obtener el total de número de registros, haga lo siguiente:

int iRowCount = rowCount.Value;

Una buena explicación de lo que los Futuros de dar es aquí.

De NHibernate 3 y arriba, usted puede usar QueryOver<T>:

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

Usted también puede querer explícitamente el fin de sus resultados como este:

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

Cuando la paginación de datos, hay otra manera de conseguir escrito el resultado de Multicriterio o todo el mundo hace lo mismo igual que yo ?

Gracias

Cómo sobre el uso de Linq to NHibernate como se discutió en la este blog por Ayende?

Ejemplo De Código:

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

Y aquí hay un post detallado por el NHibernate blog del equipo en Acceso A Datos Con NHibernate incluyendo la implementación de paginación.

Lo más probable en un GridView que se desea mostrar una rebanada de datos más el número total de filas (número de filas) de la cantidad total de datos que coinciden con su consulta.

Usted debe usar un MultiQuery para enviar tanto el Select count(*) consulta y .SetFirstResult(n).SetMaxResult(m) consultas a la base de datos en una sola llamada.

Nota el resultado será una lista que contiene 2 listas, una para el segmento de datos y uno para el recuento.

Ejemplo:

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

Sugiero que usted cree una estructura específica para lidiar con la paginación.Algo como (soy un programador de Java, pero que debe ser fácil de mapa):

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

}

Yo no suministro de una aplicación, pero se puede usar los métodos sugeridos por @Jon.He aquí una buena discusión para que le eche un vistazo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top