我有以下数据库结构,我需要完全遍历它以获得报告。
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
每个不同的关联都有一个。因此,加载所有产品变体、它们的媒体项目和每个产品类别链接,以及它们各自的类别将导致 5SELECT
秒。
我尝试过使用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)
{
...
}
}
}