Tôi chỉ mới bắt đầu với NHibernate (sử dụng SQLite) trong dự án hiện tại của tôi và tôi chủ yếu sử dụng Query<>
, bởi vì tôi đã quen thuộc viết các truy vấn db trong LINQ.Sự khác nhau giữa NHibernate Query <> vs QueryOver <> là gì?
Khi tôi đang phải đối mặt với một số truy vấn phức tạp hơn, tôi đã làm một số nghiên cứu về QueryOver<>
và figured rằng nó nên được ưa chuộng hơn vì Query<>
"cú pháp QueryOver là NH cụ thể". Ngoài ra, có vẻ như không có gì mà Query<>
có thể làm điều đó QueryOver<>
không thể thực hiện được.
Vì vậy, tôi đã bắt đầu thay thế tất cả các tập quán của Query<>
cho phù hợp. Nó không lâu trước khi tôi có "vấn đề" đầu tiên khi sử dụng Query<>
dường như thuận tiện hơn. Ví dụ (chọn giá trị cao nhất từ cột CustomNumber
trong bảng BillingDataEntity
):
int result = Session.Query<BillingDataEntity>().Select(x => x.CustomNumber).OrderByDescending(a => a).FirstOrDefault();
int result = Session.QueryOver<BillingDataEntity>().Select(x => x.CustomNumber).OrderBy(a => a.CustomNumber).Desc.Take(1).SingleOrDefault<int>();
Những gì tôi không thích là sự cần thiết để đúc một cách rõ ràng là kết quả để int và rằng các truy vấn <> phiên bản chỉ là dễ dàng hơn để đọc. Tôi nhận được truy vấn hoàn toàn sai, hoặc nói cách khác: Có cách nào tốt hơn để làm điều đó?
tôi đã xem xét kết quả SQL tạo:
NHibernate: select billingdat0_.CustomNumber as col_0_0_ from "BillingDataEntity" billingdat0_ order by billingdat0_.CustomNumber desc limit 1
NHibernate: SELECT this_.CustomNumber as y0_ FROM "BillingDataEntity" this_ ORDER BY this_.CustomNumber desc limit @p0;@p0 = 1 [Type: Int32 (0)]
gì chính xác đang i nhìn vào? Đây có phải là truy vấn "nội bộ" (phương pháp phụ thuộc) mà NHibernate tiếp tục dịch sang truy vấn cơ sở dữ liệu thực tế?
Tôi không chắc chắn bạn có thể trả lời câu hỏi đầu tiên của bạn trực tiếp như câu trả lời của tôi chỉ ra rằng QueryOver được dựa trên ICiteria và 'đây là cách nó đã được thực hiện bạn đang làm nó một cách chính xác'. Để xem SQL được tạo ra, tôi sẽ sử dụng một công cụ thương mại như NHProf vì nó là tốt nhất trên mạng. Không có nghĩa là cùn và HTH làm rõ câu trả lời tôi đã đưa ra. – Rippo
Cảm ơn bạn, hãy +1 cho một số thông tin hữu ích. –
Ngoài ra, 'Truy vấn' trả về một 'IQueryable' là một 'IEnumerable' để nó siêu thuận tiện. –
Jess