我希望在不使用连接的情况下以多对多关系选择父级子集合的主键。由于已从此示例中删除了其他约束,因此必须在子级别(Tag)而不是父级别(Item)上进行查询。
Item item = null;
Tag tag = null;
var qoTags = QueryOver.Of<Tag>(() => tag)
.JoinQueryOver(x => x.Items, () => item)
.Select(Projections.Group<Item>(() => item.ItemId));
产生
SELECT Item.ItemId
FROM Tag
inner join ItemsTags on Tag.TagId = ItemsTags.TagId
inner join Item on ItemsTags.ItemId = Item.ItemId
GROUP BY Item.ItemId
但理想情况下,生成的SQL将是:
SELECT ItemsTags.ItemId
FROM Tag
inner join ItemsTags on Tag.TagId = ItemsTags.TagId
GROUP BY ItemsTags.ItemId
请注意,删除了不必要的连接,并且“group by”和“select”子句引用了联结表的ID。
谢谢!
答案 0 :(得分:0)
我的猜测是,当你告诉NHibernate你想要使用JoinQueryOver将标签加入项目时,它将始终放入从标签到Item对象的所有步骤。
退后一步并不聪明,想想“坚持下去,在item.ItemId的查询中有一个投影组,没有提到其他项目属性,所以我可以跳过其中一个连接”
我不确定即使切换到条件或hql查询也会有帮助,因为NHibernate总是会尝试创建两个映射对象之间所需的所有连接。
你可以:
我希望有人在下面纠正我......