Tôi đang sử dụng NHibernate 3.3.1 với FluentNhibernate 1.3 cho Lớp dữ liệu.NHibernate: Làm thế nào để háo hức tìm nạp thực thể phụ với một bộ lọc trên thực thể phụ thông qua một truy vấn sql mà không lười biếng?
tôi có các đối tượng sau:
Database Diagram:
Tôi cần một phương pháp mà được các Sản phẩm theo MediaCategory của Medias của sản phẩm. Tôi muốn NHibernate chỉ gửi một truy vấn đến db và tìm nạp tất cả các thuộc tính phụ của sản phẩm.
Tôi muốn NHibernate gửi một truy vấn như thế này:
declare @mediaCategoryId int = 13
select *
from Product p
inner join Media m on m.ProductId=p.Id
inner join MediaCategoryMedia mcm on mcm.MediaId=m.Id
inner join MediaCategory mc on mc.Id=mcm.MediaCategoryId
left join ProductSeller ps on ps.ProductId=p.Id
left join Seller s on ps.SellerId=s.Id
where [email protected]
Tôi đã thử các tùy chọn sau đây để giải quyết thách thức này;
phiên
.QueryOver<ProductEntity>()
...
Tôi đã thửInner.JoinQueryOver<..>().Fetch.Eager
... nhưng tôi không thể lấy tất cả các đối tượng phụ.session.CreateCriteria<ProductEntity>().SetFetchMode("",FetchMode.Eager)
...
Trong trường hợp này tải chậm hoạt động và tôi không muốn tải xuống. Nếu tôi vô hiệu hóa lazyload từ ánh xạ NH gửi rất nhiều truy vấn .. những gì tôi muốn là mong muốn tải với một truy vấn duy nhất mà lấy tất cả các thực thể phụ.session.Query<ProductEntity>().FetchMany(p=>p.MediaList).ThenFetchMany(m=>m.SellerList)
...
Tôi không thể tạo bí danh để vượt qua bộ lọc mediaCategoryId trong trường hợp này. Thay vào đó, tôi đã sử dụng.Where(x=>x.MediaList.Any(m=>m.CategoryList.Any(...)))
và truy vấn được tạo cũng không tối ưu.(từ p trong session.Query < ProductEntity>()
từ m p.MediaList
từ c trong m.MediaCategoryList
nơi c.Id == 23
chọn p) .Fetch (x => x.MediaList);này đã không làm việc như tôi mong muốn, quá ..
var [email protected]"select p from ProductEntity as p join fetch p.MediaList as m join fetch m.MediaCategoryList as mc left join fetch p.SellerList as s where mc.Id=:catId ";
này làm việc với "join fetch" trong HQL.
Tôi cần thực hành tốt nhất của trường hợp này, tuy nhiên Hql là vua.Chúng tôi có thể xử lý trường hợp này với
session.Query<>()
hoặcsession.CreateCriteria,
hoặcQueryOver
?
Bạn cũng cần 'Media.MediaCategoryList' để trở về dân cư? Hay bạn chỉ quan tâm đến 'Product.MediaList' và' Product.SellerList'? –