Trang chủ » CSharp » Phân trang trong Nhibernate

Phân trang trong Nhibernate


Đây là lớp giúp phân trang trong Nhibernate với Lớp T

public abstract class Paging<T>
   {
      public IList<T> GetPagedData(int page, int pageSize, out long count, Order oder, params ICriterion[] criterion)
      {
          IMultiCriteria multiCriteria  = NHibernateHelper.CurrentSession.CreateMultiCriteria();
          ICriteria criteria1 = NHibernateHelper.CurrentSession.CreateCriteria(typeof(T));
          ICriteria criteria2 =
              NHibernateHelper.CurrentSession.CreateCriteria(typeof (T));//.SetProjection(Projections.RowCountInt64());
          foreach (var item in criterion)
          {
              criteria1.Add(item);
              criteria2.Add(item);
          }
          criteria2.SetProjection(Projections.RowCountInt64());
          criteria1.AddOrder(oder);         
          multiCriteria.Add(criteria1);
          multiCriteria.Add(criteria2);
         // page = page > 0 ? page : 1;
          criteria1.SetFirstResult(page * pageSize).SetMaxResults(pageSize);          
          IList result = multiCriteria.List();
          IList<T> all = (from object o in (IList) result[0] select (T) o).ToList();
          count = (long)((IList)result[1])[0];
          return all;
      }
   }

Lớp NHibernateHelper

public sealed  class NHibernateHelper
    {
      private static ISessionFactory factory = null;
      static NHibernateHelper()
        {
            Configuration cfg = new Configuration();
            cfg.Configure();
            factory = cfg.BuildSessionFactory();
        }

        public static ISession CurrentSession
        {
            get
            {
                if(factory==null)
                {
                    var configuration = new Configuration();
                    configuration.Configure();
                    factory = configuration.BuildSessionFactory();
                }
                return factory.OpenSession();
            }
        }
        public static void CloseSession()
        {
            factory.Close();
        }
    }

Chú ý : đối với hệ quản trị Mysql không hỗ trợ MultiCriteria ta có thể viết lại lớp Paging như sau :

public abstract class Paging<T>
   {

    public IList<T> GetPagedData(int page, int pageSize, out long count, Order oder, params ICriterion[] criterion)
        {
           // IMultiCriteria multiCriteria = NHibernateHelper.CurrentSession.CreateMultiCriteria();
            ICriteria criteria1 = NHibernateHelper.CurrentSession.CreateCriteria(typeof(T));
            ICriteria criteria2 =
                NHibernateHelper.CurrentSession.CreateCriteria(typeof(T));//.SetProjection(Projections.RowCountInt64());
            foreach (var item in criterion)
            {
                criteria1.Add(item);
                criteria2.Add(item);
            }
            criteria2.SetProjection(Projections.RowCountInt64());
            criteria1.AddOrder(oder);
           // multiCriteria.Add(criteria1);
           // multiCriteria.Add(criteria2);
            criteria1.SetFirstResult(page * pageSize).SetMaxResults(pageSize);
            count = long.Parse(criteria2.List()[0].ToString());
            return   criteria1.List<T>();
           // IList result = multiCriteria.List();
           // IList<T> all = (from object o in (IList)result[0] select (T)o).ToList();
           // count = (long)((IList)result[1])[0];
           // return all;
        }
    }

2 thoughts on “Phân trang trong Nhibernate

  1. Pingback: Up.VietGeeks.com

  2. Chào anh.em cũng có làm với Nhibernate và cũng thử phân trang kiểu này,thấy cũng rất tốt.Nhưng nếu dữ liệu cực lớn thì cách này sẽ rất chậm vì khi chạy thì câu lệnh tương ứng đến database la câu lện “Select top”.Anh có cách nào chỉ lấy ra số lượng bản ghi bằng pagesize ko ạ!
    Thanks anh!

Bình luận

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s