【发布时间】:2012-03-13 21:13:37
【问题描述】:
我有这个模型
Product
- int Id
- string Name
- List<ProductChannelAffectation> Affectations
ProductChannelAffectation
- Channel Channel
- Product Product
- double Price
所以我想在 2 次查询(没有 N+1 问题)中获得第 10 个符合某些条件的产品及其影响,如果可能的话,在 1 次访问数据库中。
所以我读了这个答案
https://stackoverflow.com/a/7035649/277067 或者这个 https://stackoverflow.com/a/5285739/277067
但是这里有两个问题:
条件在 2 个查询中重复“Where(x => x.Id == ID)”,当它是简单条件时没关系,但如果它是复杂条件(涉及其他表、文本搜索.. .)
没有“顶部”条件。
这里的延迟加载会导致 N+1 问题。
我试过了
var products = _nhSession.QueryOver<Product>()
.Where(...)
.Take(10)
.List()
.ToList();
var idsproduct = products.Select(p => p.ID);
var affectation = _nhSession.QueryOver<ProductChannel>()
.Where(c => c.Product.ID.IsIn(idsproduct))
.ToList();
但是在执行第二个查询之前还有 N+1 (用于获取伪装)。
这是我的关联的声明方式
<bag name="Affectations" access="property" table="Product" lazy="false">
<key column="n_Product" />
<one-to-many class="CTV.ProductChannel, CTV" />
</bag>
我正在使用 activerecord 进行声明。
【问题讨论】:
标签: c# nhibernate