Question

Par exemple, je veux remplir un contrôle gridview dans une ASP.NET page web avec uniquement les données nécessaires pour le nombre de lignes affichées.Comment peut-NHibernate l'appui de cette?

Était-ce utile?

La solution

ICriteria a un SetFirstResult(int i) la méthode, qui indique l'index du premier élément que vous souhaitez obtenir (essentiellement la première ligne de données dans votre page).

Il dispose également d'un SetMaxResults(int i) la méthode, qui indique le nombre de lignes que vous souhaitez obtenir (c'est à dire, la taille de vos pages).

Par exemple, ce critère de l'objet obtient les 10 premiers résultats de votre grille de données:

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

Autres conseils

Vous pouvez également profiter des contrats à Terme de fonctionnalité dans NHibernate pour exécuter la requête pour obtenir le total du nombre d'enregistrements ainsi que les résultats dans une seule requête.

Exemple

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

Pour obtenir le total du nombre d'enregistrement, vous effectuez les opérations suivantes:

int iRowCount = rowCount.Value;

Une bonne discussion de ce Terme vous donner est ici.

De NHibernate 3 et ci-dessus, vous pouvez utiliser QueryOver<T>:

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

Vous pouvez également explicitement l'ordre de vos résultats comme ceci:

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

Lors de la pagination de données est-il une autre façon d'obtenir tapé résultat de Multicritère ou tout le monde fait la même chose tout comme moi ?

Merci

Comment au sujet de l'utilisation de Linq to NHibernate tel que discuté dans ce blog par Ayende?

Exemple De Code:

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

Et ici est détaillée poste par l'NHibernate blog de l'équipe sur Accès Aux Données Avec NHibernate y compris la mise en œuvre de la pagination.

Le plus probable dans un GridView vous voulez montrer une tranche de données, plus le nombre total de lignes (nombre de lignes) de la quantité totale de données qui correspondent à votre requête.

Vous devez utiliser un MultiQuery d'envoyer le Select count(*) et de requête .SetFirstResult(n).SetMaxResult(m) des requêtes sur votre base de données en un seul appel.

Notez le résultat sera une liste qui contient 2 listes, une pour la tranche de données et une pour le comte.

Exemple:

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

Je vous suggère de créer une structure spécifique pour traiter avec la pagination.Quelque chose comme (je suis un programmeur Java, mais ça devrait être facile de la carte):

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

}

Je n'ai pas d'alimentation de mise en œuvre, mais vous pouvez utiliser les méthodes proposées par @Jon.Voici un bonne discussion pour vous de prendre un coup d'oeil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top