使用NHibernate在单独的SELECT中热切地获取多个嵌套集合

时间:2012-06-01 12:24:57

标签: c# database nhibernate prefetch

我有以下数据库结构,我需要完全遍历报告。

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)
        {
              ...
        }
    }
}

1 个答案:

答案 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到你想要选择的各个项目的关系