使用 NHibernate 在单独的 SELECT 中急切地获取多个嵌套集合
本文关键字:获取 集合 嵌套 NHibernate 单独 SELECT 使用 | 更新日期: 2023-09-27 18:36:05
我有以下数据库结构,我需要完全遍历以生成报告。
Product -> ProductVariation -> ProductMedaItem
Product -> CategoryLinks -> Category
我对Products
表有一个查询,并希望预取上述数据,因为我将一起访问它们。我想避免使用 JOIN,因为组合会爆炸并导致数据加载。
在我看来,理想的解决方案如下:
- 发出查询以加载所有匹配的产品
- 然后,根据类似于 '
Select * from ProductVariations where ProductId in ([all_product_id_set])
的查询解析结果集,并一起加载所有产品变体; - 同样,将分析此结果集,并使用类似于
Select * from ProductMediaItem where ProductVariationId in ([all_product_variation_id_set]);
的查询获取所有ProductMediaItem
- 等等等等
这将导致每个不同的关联产生一个SELECT
。因此,要加载所有产品变体、其媒体项和每个产品类别链接及其各自的类别,将导致 5 SELECT
秒。
我试过使用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)
{
...
}
}
}
MultiQuery 和 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 次执行所有查询,唯一的"技巧"是将关系从产品向下导航到您想要选择的各种项目