我想做一个子查询,然后内部连接结果以产生查询。我想这样做,因为我已经测试了一个内部连接查询,与直接 IN 子查询相比,它在 MySql 上的性能似乎要高得多。
下面是我试图重现的 sql 类型的一个非常基本的示例。
表
物品
- 项目 ID
- 姓名
项目关系
- 项目 ID
- 关系 ID
我想创建的示例 Sql
给我名称为“bob”的项目的关系计数:
select ir.itemId, count(ir.relationId)
from ItemRelations ir
inner join (select itemId from Items where name = 'bob') sq
on ir.itemId = sq.itemId
group by ir.itemId
基本的 Nhibernate QueryOver
var bobItems = QueryOver.Of<Item>(() => itemAlias)
.Where(() => itemAlias.Name == "bob")
.Select(Projections.Id());
var bobRelationCount = session.QueryOver<ItemRelation>(() => itemRelationAlias)
.Inner.Join(/* Somehow join the detached criteria here on the itemId */)
.SelectList(
list =>
list.SelectGroup(() => itemRelationAlias.ItemId)
.WithAlias(() => itemRelationCountAlias.ItemId)
.SelectCount(() => itemRelationAlias.ItemRelationId)
.WithAlias(() => itemRelationCountAlias.Count))
.TransformUsing(Transformers.AliasToBean<ItemRelationCount>())
.List<ItemRelationCount>();
我知道可以将其重构为单个查询,但是以上只是作为简单示例。我无法更改分离的 QueryOver,因为它已交给我的代码并用于系统的其他部分。
有谁知道是否可以根据分离的标准进行内部连接?