2009-02-16 40 views

Trả lời

30

Nó thực sự khá dễ dàng trong HQL:

var top15 = session.CreateQuery("from SomeEntity") 
       .SetFirstResult(0) 
       .SetMaxResults(15) 
       .List<SomeEntity>(); 

Không biết làm thế nào để làm điều này bằng cách sử dụng API tiêu chí mặc dù.

+0

+1. Huh khá lạ. Tôi nghĩ câu trả lời sẽ là một phần của chuỗi HQL "đường hầm". Hấp dẫn. – BuddyJoe

+3

Câu trả lời này thực sự là kết hợp của HQL và tiêu chí API –

+0

yea..it về cơ bản giống như tiêu chí ... chỉ thay thế bằng 'CreateCriteria ()' – dotjoe

10

Tiêu chuẩn Phương pháp API:

ICriteria criteria = DaoSession.CreateCriteria(typeof(T)); 
criteria.SetFirstResult(StartIndex); 
criteria.SetMaxResults(MaximumObjects); 
return criteria.List<T>(); 
+0

+1. Tôi sẽ phải xem xét MaximumObjects này. Tuyệt đấy. – BuddyJoe

+1

MaximumObjects chỉ là một biến số nguyên để báo cho SetMaxResults có bao nhiêu đối tượng cần trả về. Trong trường hợp của bạn, bạn có thể mã cứng 15 thay vào đó, tức là tiêu chí.SetMaxResults (15); –

+0

Haha ... nói cách khác nó giống hệt với CreateQuery() sau khi cá thể được tạo. –

0

Để hoàn chỉnh, đây là cách để làm điều đó với QueryOver API được giới thiệu trong NHibernate 3.0:

var top15 = session.QueryOver<SomeEntity>().Take(15).List(); 

Ném trong một .Skip(someInt) nếu bạn cần phải xác định một chỉ mục bắt đầu, ví dụ để phân trang.

0

mookid8000 đang cung cấp thông tin sai lệch.

không có cách nào thiết lập SQL TOP N với HQL :(

nó luôn luôn tải tất cả các bảng để NET và lấy TOP, mà chỉ là đồng bằng ngu ngốc!

2

Từ NHibernate 3.2 bạn có thể sử dụng SKIP n/TAKE n trong HQL ở phần cuối của các truy vấn Nó có thể rất hữu ích trong việc truy vấn con nơi bạn không thể sử dụng SetMaxResults

Ví dụ:..

select l, (select u from User u where u.Location = l order by u.Date asc take 1) 
from Location l