Tôi đang cố gắng để lựa chọn một tổ chức và lấy một danh sách có liên quan:NHibernate QueryOver với Fetch kết quả truy vấn nhiều sql và db chạm
Session.QueryOver<UserRole>()
.Fetch(x => x.UsersInRole).Eager
.List();
nào dẫn đến rất nhiều hits cơ sở dữ liệu. Người đầu tiên là một cái gì đó như:
SELECT ... FROM UserRoles left outer join UsersInRoles on ...
Và hàng trăm các truy vấn riêng biệt hơn mà trông giống như sau:
SELECT ... FROM UsersInRoles left outer join UserRoles on ... WHERE UserRoles.UserId=?
Việc lập bản đồ là như sau:
public class UserRoleMap : ClassMap<UserRole>
{
public UserRoleMap()
{
Id(x => x.Id);
Map(x => x.RoleName);
HasManyToMany(x => x.UsersInRole)
.Inverse()
.LazyLoad()
.Table("UsersInRoles");
}
}
Đã cố gắng đề xuất của bạn. Kết quả trong 1 + 12 truy vấn - MUCH tốt hơn trước đó, nhưng không phải là có một cách để làm cho nó ít hơn 12? (tăng kích thước lô?) - chi phí của kích thước lô là bao nhiêu? Tôi sẽ nói rằng nếu nó là tất cả tốt nó sẽ được thiết lập theo mặc định. Kích thước lô có phải là giải pháp duy nhất không? Không phải là có thể tham gia mà sẽ dẫn đến 2 truy vấn? Nếu tôi cần thiết để viết nó tự của tôi với SQL đơn giản, tôi nghĩ rằng 2 truy vấn sẽ là đủ. Cảm ơn. –
Nếu có giải pháp nào tốt hơn kích thước hàng loạt, có thể, tôi không chắc chắn. Lý do tại sao điều này không được bật theo mặc định, có thể là một thực tế, rằng đây là vi phạm logic đơn giản: Proxy của đối tượng uninitialize là một trình điều khiển. Nó trực tiếp đi cho dữ liệu của nó khi cần thiết. Việc định cỡ hàng loạt di chuyển một số nỗ lực nhiều hơn vào phiên để tham gia các CHỌN này. Dù sao, kích thước lô là trên tất cả * bộ sưu tập của chúng tôi * và ánh xạ lớp. Và hiệu suất là tuyệt vời ngay cả trên bộ lớn –