উত্তর:
ICriteria
একটি SetFirstResult(int i)
পদ্ধতি রয়েছে, যা আপনি পেতে চান এমন প্রথম আইটেমের সূচক নির্দেশ করে (মূলত আপনার পৃষ্ঠায় প্রথম ডেটা সারি)।
এটির একটি SetMaxResults(int i)
পদ্ধতিও রয়েছে, যা আপনি পেতে চান এমন সারিগুলির সংখ্যা নির্দেশ করে (অর্থাত্ আপনার পৃষ্ঠার আকার)।
উদাহরণস্বরূপ, এই মানদণ্ডের অবজেক্টটি আপনার ডেটা গ্রিডের প্রথম 10 টি ফলাফল পেয়েছে:
criteria.SetFirstResult(0).SetMaxResults(10);
মোট রেকর্ড গণনা এবং একক ক্যোয়ারিতে প্রকৃত ফলাফল পেতে কোয়েরিটি কার্যকর করতে আপনি এনএইচবারনেটে ফিউচার বৈশিষ্ট্যটিও নিতে পারেন।
উদাহরণ
// 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();
.Skip(PageNumber * PageSize)
এইভাবে, পৃষ্ঠার আকার যদি 10 হয় তবে এটি প্রথম 10 টি সারি পুনরুদ্ধার করতে পারে না। সূত্রটি সঠিক করার জন্য আমি সম্পাদনা করছি। ধারণাটিগতভাবে ধরে নেওয়া, PageNumber
0 হওয়া উচিত নয়। এটি ন্যূনতম 1 হওয়া উচিত
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); }
}
যখন পেজিং ডেটা মাল্টিক্রিটেরিয়া থেকে টাইপ করা ফলাফল পাওয়ার জন্য অন্য কোনও উপায় থাকে বা প্রত্যেকেই আমার মতো একই হয়?
ধন্যবাদ
আয়েন্দির এই ব্লগ পোস্টে যেমন আলোচনা করা হয়েছে তেমন লিনক থেকে এনএইচবারনেট ব্যবহার সম্পর্কে কীভাবে ?
কোড নমুনা:
(from c in nwnd.Customers select c.CustomerID)
.Skip(10).Take(10).ToList();
এবং এখানে পেজিং বাস্তবায়ন সহ এনএইচবারনেট ডেটা অ্যাক্সেস সম্পর্কিত এনএইচবারনেট টিম ব্লগের একটি বিশদ পোস্ট ।
গ্রিডভিউতে সম্ভবত আপনি আপনার ক্যোয়ারীর সাথে মেলে এমন পরিমাণের পরিমাণের সারির মোট সংখ্যা (রোউকউন্ট) এবং আরও সারি (সার্বিক সংখ্যা) দেখাতে চাইবেন।
আপনার একটি ডাটাবেসে সিলেক্ট কাউন্ট (*) ক্যোয়ারী এবং .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];
আমি পরামর্শ দিচ্ছি যে আপনি পৃষ্ঠাগুলি মোকাবেলার জন্য একটি নির্দিষ্ট কাঠামো তৈরি করুন। এর মতো কিছু (আমি জাভা প্রোগ্রামার, তবে এটির মানচিত্রটি সহজ হওয়া উচিত):
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()
}
আমি কোনও বাস্তবায়ন সরবরাহ করি নি তবে আপনি @ জন দ্বারা প্রস্তাবিত পদ্ধতিগুলি ব্যবহার করতে পারেন । আপনার একবার দেখার জন্য এখানে একটি ভাল আলোচনা ।