0

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

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

1 回答 1

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>();

等等...当您枚举其中任何一个时,它将一次性执行所有查询,唯一的“技巧”是将关系从 Product 向下导航到您要选择的各种项目

于 2012-06-01T12:36:50.033 回答