কীভাবে আপনি এনএইচবারনেট দিয়ে পেজিং করতে পারেন?


107

উদাহরণস্বরূপ, আমি একটি এএসপি.নেট ওয়েব পৃষ্ঠায় একটি গ্রিডভিউ নিয়ন্ত্রণ পপুলেশন করতে চাই যেখানে প্রদর্শিত সারিগুলির # টির জন্য প্রয়োজনীয় ডেটা রয়েছে। এনহাইবারনেট কীভাবে এটি সমর্থন করতে পারে?

উত্তর:


111

ICriteriaএকটি SetFirstResult(int i)পদ্ধতি রয়েছে, যা আপনি পেতে চান এমন প্রথম আইটেমের সূচক নির্দেশ করে (মূলত আপনার পৃষ্ঠায় প্রথম ডেটা সারি)।

এটির একটি SetMaxResults(int i)পদ্ধতিও রয়েছে, যা আপনি পেতে চান এমন সারিগুলির সংখ্যা নির্দেশ করে (অর্থাত্ আপনার পৃষ্ঠার আকার)।

উদাহরণস্বরূপ, এই মানদণ্ডের অবজেক্টটি আপনার ডেটা গ্রিডের প্রথম 10 টি ফলাফল পেয়েছে:

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

1
লিনক (টু এনএইচ) সিনট্যাক্সটি যেভাবেই দেখাবে - এটি বেশ সুন্দর।
মটোউইলিয়ামস

13
এটি উল্লেখ করা গুরুত্বপূর্ণ যে আপনার পেজারটি রেন্ডার করার জন্য আপনার মোট সারি গণনা পুনরুদ্ধারের জন্য পৃথক লেনদেন চালানো দরকার।
কেভিন পাং

1
এটি এসকিউএল সার্ভারে একটি নির্বাচন শীর্ষ অনুসন্ধান করে। সেটফার্সআরসাল্ট (1) দিয়ে এটি ব্যবহার করে দেখুন .সেটম্যাক্সেরসাল্ট (2);
ক্রিস এস

4
এটি পূর্ববর্তী মন্তব্যটি NHibernate.Dialect.MsSql2000Dialect NHibernate.Dialect.MsSql2005 ডায়ালেক্ট
ক্রিস এস

আইকিউরির একই ফাংশন রয়েছে, সুতরাং এটি এইচকিউএল সহও ব্যবহার করা যেতে পারে।
goku_da_master

87

মোট রেকর্ড গণনা এবং একক ক্যোয়ারিতে প্রকৃত ফলাফল পেতে কোয়েরিটি কার্যকর করতে আপনি এনএইচবারনেটে ফিউচার বৈশিষ্ট্যটিও নিতে পারেন।

উদাহরণ

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

ফিউচার আপনাকে যা দেয় তার একটি ভাল আলোচনা এখানে


3
এটা অসাধারণ. ফিউচারগুলি মাল্টিক্রিটারিয়ার সিনট্যাকটিকাল জটিলতা ছাড়াই হুবহু মাল্টিক্রিটারিয়ার মতো কাজ করে।
ডেভগার্সিয়া

ফিউচার সম্পর্কে পোস্টটি পড়ার পরে আমি ভাবছিলাম যে আমার সমস্ত ডেটাবেস প্রশ্নের জন্য ফিউচারটি ব্যবহার করা উচিত ... এর অপূর্ণতা কী? :)
হ্যাকসসর

46

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

.Skip(PageNumber * PageSize)এইভাবে, পৃষ্ঠার আকার যদি 10 হয় তবে এটি প্রথম 10 টি সারি পুনরুদ্ধার করতে পারে না। সূত্রটি সঠিক করার জন্য আমি সম্পাদনা করছি। ধারণাটিগতভাবে ধরে নেওয়া, PageNumber0 হওয়া উচিত নয়। এটি ন্যূনতম 1 হওয়া উচিত
অমিত জোশী

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

যখন পেজিং ডেটা মাল্টিক্রিটেরিয়া থেকে টাইপ করা ফলাফল পাওয়ার জন্য অন্য কোনও উপায় থাকে বা প্রত্যেকেই আমার মতো একই হয়?

ধন্যবাদ


23

আয়েন্দির এই ব্লগ পোস্টে যেমন আলোচনা করা হয়েছে তেমন লিনক থেকে এনএইচবারনেট ব্যবহার সম্পর্কে কীভাবে ?

কোড নমুনা:

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

এবং এখানে পেজিং বাস্তবায়ন সহ এনএইচবারনেট ডেটা অ্যাক্সেস সম্পর্কিত এনএইচবারনেট টিম ব্লগের একটি বিশদ পোস্ট ।


নাইটবারনেট-এ নোট লিনাক অবদানের প্যাকেজে রয়েছে এবং এনএইচবারনেট ২.০ রিলিজটিতে অন্তর্ভুক্ত নেই
রিচার্ড

11

গ্রিডভিউতে সম্ভবত আপনি আপনার ক্যোয়ারীর সাথে মেলে এমন পরিমাণের পরিমাণের সারির মোট সংখ্যা (রোউকউন্ট) এবং আরও সারি (সার্বিক সংখ্যা) দেখাতে চাইবেন।

আপনার একটি ডাটাবেসে সিলেক্ট কাউন্ট (*) ক্যোয়ারী এবং .SetFirstResult (n) .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];

6

আমি পরামর্শ দিচ্ছি যে আপনি পৃষ্ঠাগুলি মোকাবেলার জন্য একটি নির্দিষ্ট কাঠামো তৈরি করুন। এর মতো কিছু (আমি জাভা প্রোগ্রামার, তবে এটির মানচিত্রটি সহজ হওয়া উচিত):

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

}

আমি কোনও বাস্তবায়ন সরবরাহ করি নি তবে আপনি @ জন দ্বারা প্রস্তাবিত পদ্ধতিগুলি ব্যবহার করতে পারেন । আপনার একবার দেখার জন্য এখানে একটি ভাল আলোচনা


0

আপনার 2 টি মানদণ্ড সংজ্ঞায়িত করার দরকার নেই, আপনি একটি নির্ধারণ করতে এবং এটি ক্লোন করতে পারেন। এন হাইবারনেট মানদণ্ড ক্লোন করতে আপনি একটি সাধারণ কোড ব্যবহার করতে পারেন:

var criteria = ... (your criteria initializations)...;
var countCrit = (ICriteria)criteria.Clone();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.