我有以下数据库结构,我需要完全遍历报告。
Product -> ProductVariation -> ProductMedaItem
Product -> CategoryLinks -> Category
我在Products
表上有一个查询,想要预取上述数据,因为我将一起访问它们。我想避免使用JOIN,因为组合会爆炸并导致数据加载。
我眼中的理想解决方案如下:
Select * from ProductVariations where ProductId in ([all_product_id_set])
; ProductMediaItem
Select * from ProductMediaItem where ProductVariationId in ([all_product_variation_id_set]);
这将导致每个不同关联一个SELECT
。因此,要加载所有产品变体,其媒体项目和每个产品类别链接及其各自的类别,将导致5 SELECT
s。
我尝试过使用criteria.SetFetchMode("ProductVariations", FetchMode.Select")
,但这没有做任何事情。我目前的解决方法是使用批处理,但这仍然导致大约50 - 60个查询来获取所有数据,虽然速度不是很慢,但我认为它可以更快。
我正在使用最新版本的NHibernate - 3.3。
更新1
我想使用普通OOP遍历集合,例如:
foreach (var p in Products)
{
foreach (var variation in p.ProductVariations)
{
foreach (var mediaItem in variation.MediaItems)
{
...
}
}
}
答案 0 :(得分:0)
MultiQueries和MultiCriteria可以使用,甚至更简单,例如:
var productVariations = session.CreateQuery(
"Select * from ProductVariations where ProductId in ([all_product_id_set])")
.Future<ProductVariations>();
var mediaItems = session.CreateQuery(
"select pv.MediaItems from ProductVariations pv where pv.ProductId in ([all_product_id_set])")
.Future<ProductMediaItem>();
...等 当你枚举其中任何一个时,它将执行1 go中的所有查询,唯一的“技巧”是向下导航从Product到你想要选择的各个项目的关系