سؤال

على سبيل المثال أريد أن تعيش gridview التحكم في ASP.NET صفحة ويب فقط مع البيانات اللازمة # الصفوف المعروضة.كيف يمكن أن NHibernate دعم هذا ؟

هل كانت مفيدة؟

المحلول

ICriteria لديه SetFirstResult(int i) الأسلوب الذي يشير مؤشر العنصر الأول الذي كنت ترغب في الحصول على (الأساس أول صف البيانات في الصفحة الخاصة بك).

كما أن لديها SetMaxResults(int i) الأسلوب الذي يشير إلى عدد الصفوف التي ترغب في الحصول على (أي حجم الصفحة).

على سبيل المثال, هذا الكائن يحصل على أول 10 نتائج بيانات الشبكة:

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

نصائح أخرى

يمكنك أيضا الاستفادة من العقود الآجلة ميزة في NHibernate لتنفيذ الاستعلام للحصول على إجمالي عدد السجلات وكذلك النتائج الفعلية في استعلام واحد.

على سبيل المثال

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

للحصول على إجمالي عدد السجلات ، يمكنك القيام بما يلي:

int iRowCount = rowCount.Value;

مناقشة جيدة ما الآجلة تعطيك هنا.

من NHibernate 3 أعلاه, يمكنك استخدام QueryOver<T>:

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

قد تحتاج أيضا إلى صراحة ترتيب النتائج الخاصة بك مثل هذا:

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

عند ترحيل البيانات هل هناك طريقة أخرى للحصول على كتابتها نتيجة MultiCriteria أو الجميع يفعل نفس الشيء تماما مثل لي ؟

شكرا

كيف حول استخدام Linq إلى NHibernate كما نوقش في هذا بلوق وظيفة قبل Ayende?

نموذج التعليمات البرمجية:

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

وهنا وظيفة مفصلة من قبل NHibernate فريق بلوق على الوصول إلى البيانات مع NHibernate بما في ذلك تنفيذ الترحيل.

على الأرجح في GridView كنت تريد أن تظهر شريحة بيانات بالإضافة إلى عدد من الصفوف (rowcount) من إجمالي كمية البيانات التي تطابق الاستعلام الخاص بك.

يجب عليك استخدام MultiQuery لإرسال كل Select count(*) الاستعلام .SetFirstResult(ن).SetMaxResult(م) استعلامات قاعدة البيانات الخاصة بك في مكالمة واحدة.

ملاحظة النتيجة سوف تكون قائمة يحمل 2 قوائم واحد للبيانات شريحة واحدة عدد.

على سبيل المثال:

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

أقترح أن تقوم بإنشاء بنية محددة للتعامل مع ترقيم الصفحات.شيء مثل (أنا مبرمج جافا ، ولكن ينبغي أن يكون من السهل على الخريطة):

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

}

لم مستلزمات التنفيذ ، ولكن هل يمكن استخدام الأساليب المقترحة من قبل @جون.هنا مناقشة جيدة لك أن تأخذ نظرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top