Ví dụ, tôi muốn điền một điều khiển GridView trong một trang web ASP.NET chỉ với dữ liệu cần thiết cho số hàng được hiển thị. NHibernate có thể hỗ trợ điều này như thế nào?Làm thế nào bạn có thể thực hiện phân trang với NHibernate?
Trả lời
ICriteria
có phương thức SetFirstResult(int i)
, cho biết chỉ mục của mục đầu tiên bạn muốn nhận (về cơ bản là hàng dữ liệu đầu tiên trong trang của bạn).
Nó cũng có phương thức SetMaxResults(int i)
, cho biết số hàng bạn muốn nhận (nghĩa là kích thước trang của bạn).
Ví dụ, đối tượng tiêu chí này nhận được 10 kết quả đầu tiên của lưới dữ liệu của bạn:
criteria.SetFirstResult(0).SetMaxResults(10);
Cách sử dụng LINQ to NHibernate như được thảo luận trong this blog post bởi Ayende?
Mã mẫu:
(from c in nwnd.Customers select c.CustomerID)
.Skip(10).Take(10).ToList();
Và đây là một bài chi tiết bởi đội ngũ blog của NHibernate trên Data Access With NHibernate bao gồm việc thực hiện phân trang.
Note LINQ to Nhibernate là trong gói contrib và không bao gồm trong NHibernate Bản phát hành 2.0 – Richard
tôi đề nghị bạn nên tạo một cấu trúc cụ thể để đối phó với pagination. Giống như (tôi là một lập trình viên Java, nhưng đó phải là dễ dàng để lập bản đồ):
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()
}
Tôi đã không cung cấp một thực hiện, nhưng bạn có thể sử dụng các phương pháp được đề xuất bởi @Jon. Đây là một good discussion để bạn có một cái nhìn.
Rất có thể trong GridView, bạn sẽ muốn hiển thị một lát dữ liệu cộng với tổng số hàng (hàng đếm) của tổng lượng dữ liệu khớp với truy vấn của bạn.
Bạn nên sử dụng một MultiQuery để gửi cả truy vấn Chọn số (*) và .SetFirstResult (n) .SetMaxResult (m) truy vấn vào cơ sở dữ liệu của bạn trong một cuộc gọi duy nhất.
Lưu ý kết quả sẽ là danh sách chứa 2 danh sách, một danh sách cho lát dữ liệu và một cho số đếm.
Ví dụ:
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 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); }
}
Khi phân trang dữ liệu là có một cách khác để có được kết quả gõ từ MultiCriteria hoặc tất cả mọi người cũng làm như vậy giống như tôi?
Cảm ơn
Bạn cũng có thể tận dụng lợi thế của các tính năng tương lai trong NHibernate để thực hiện truy vấn để có được tổng kỷ lục đếm cũng như kết quả thực tế trong một truy vấn duy nhất.
Ví dụ
// 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>();
Để có được tổng số hồ sơ, bạn làm như sau:
int iRowCount = rowCount.Value;
Một cuộc thảo luận tốt về những gì tương lai cung cấp cho bạn là here.
Công cụ tuyệt vời, cảm ơn –
Điều này thật tuyệt. Tương lai hoạt động chính xác như đa chuẩn mà không có sự phức tạp cú pháp của đa chuẩn. – DavGarcia
Sau khi đọc bài viết về tương lai tôi đang tự hỏi liệu tôi có nên sử dụng tương lai cho tất cả các truy vấn cơ sở dữ liệu của mình không ... Hạn chế là gì? :) – hakksor
Trong NHibernate 3 bạn có thể sử dụng QueryOver
var pageRecords = nhSession.QueryOver<TEntity>()
.Skip(PageNumber * PageSize)
.Take(PageSize)
.List();
Bạn cũng có thể muốn đặt hàng một cách rõ ràng kết quả của bạn như thế này:
var pageRecords = nhSession.QueryOver<TEntity>()
.OrderBy(t => t.AnOrderFieldLikeDate).Desc
.Skip(PageNumber * PageSize)
.Take(PageSize)
.List();
- 1. Làm thế nào để bạn thực hiện phân trang trong PHP?
- 2. Làm thế nào để bạn thực hiện phân trang trong ASP.NET MVC?
- 3. Làm thế nào để thực hiện Sum có điều kiện với Nhibernate?
- 4. Với jQuery preventDefault() làm thế nào bạn có thể thực hiện hành động mặc định?
- 5. Làm thế nào để bạn thực hiện một Assembler?
- 6. Làm thế nào tôi có thể làm phân trang với bộ sưu tập @OneToMany
- 7. Làm thế nào tôi có thể có NHibernate chỉ tạo ra các SQL mà không thực hiện nó?
- 8. Vấn đề với nHibernate biệt và phân trang
- 9. Làm thế nào bạn có thể hủy một SQL quá trình thực hiện chủ lập trình
- 10. Làm thế nào để bạn thực hiện đặt lại trên một JQuery có thể sắp xếp
- 11. Làm thế nào người ta có thể đi về thực hiện một phân mảnh đĩa?
- 12. Làm thế nào để thực hiện truy vấn được phân trang bằng ScalaQuery?
- 13. NHibernate thực hiện theo dõi thay đổi như thế nào?
- 14. Làm thế nào để bạn thực hiện triển khai cán với capistrano?
- 15. Làm thế nào để bạn thực hiện một div theo sau khi bạn cuộn?
- 16. Làm thế nào tôi có thể thực hiện phiên NHibernate cho mỗi yêu cầu mà không có sự phụ thuộc vào NHibernate?
- 17. Làm thế nào để bạn thực hiện nhiều lần tham gia bên trong trong LINQ đối với các thực thể
- 18. Làm thế nào để có được thành thạo NHibernate làm việc với NHibernate 3.x
- 19. Làm thế nào để bạn ánh xạ một thực thể -> mối quan hệ giao diện sử dụng Fluent NHibernate?
- 20. Làm thế nào để bạn thực hiện việc làm mờ những gì bạn đã tìm kiếm?
- 21. Làm thế nào để bạn thực hiện Node.js nói chuyện với một dịch vụ SOAP?
- 22. Bạn có thể trộn Fluent NHibernate và hbm.xml thông thường
- 23. Làm thế nào để bạn thực hiện liên kết động với KnockOut JS?
- 24. Làm thế nào để thực hiện một DIv với một Rails Link có thể click?
- 25. Làm thế nào tôi có thể thực hiện công việc perltidy với Phương pháp :: Chữ ký?
- 26. Làm cách nào bạn có thể tránh NHibernate N + 1 bằng phím tổng hợp
- 27. Làm cách nào để thực hiện TDD hiệu quả với NHibernate?
- 28. Làm thế nào để thực hiện cập nhật một phần trang với jquery
- 29. Làm thế nào để phát hiện xem trang hiện tại có phải là trang chủ với CakePhp không?
- 30. Bạn có thể thực hiện HtmlDecode & HtmlEncode trong Silverlight không?
Điều này khá giống với cú pháp LINQ (NH) sẽ trông như thế nào - Tốt. – MotoWilliams
Điều quan trọng cần lưu ý là bạn sẽ cần phải thực hiện một giao dịch riêng để truy xuất tổng số hàng để hiển thị máy nhắn tin của bạn. –
Điều này thực hiện truy vấn SELECT TOP trong SQL Server. Hãy thử với SetFirstResult (1) .SetMaxResult (2); –