在nHibernate中选择不加入的子集合ID

时间:2012-06-26 01:02:02

标签: nhibernate collections identifier queryover

我希望在不使用连接的情况下以多对多关系选择父级子集合的主键。由于已从此示例中删除了其他约束,因此必须在子级别(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。

谢谢!

1 个答案:

答案 0 :(得分:0)

我的猜测是,当你告诉NHibernate你想要使用JoinQueryOver将标签加入项目时,它将始终放入从标签到Item对象的所有步骤。

退后一步并不聪明,想想“坚持下去,在item.ItemId的查询中有一个投影组,没有提到其他项目属性,所以我可以跳过其中一个连接”

我不确定即使切换到条件或hql查询也会有帮助,因为NHibernate总是会尝试创建两个映射对象之间所需的所有连接。

你可以:

  • 执行直接的SQL查询(如果您将所有查询内容用于其他一些标准,则不是很好)
  • 将模型更改为Tag和Item之间的映射类。 Tag-&gt; one-to-many-&gt; TagItem-&gt; many-to-one-&gt; Item(YUK!我不喜欢那个的味道!)

我希望有人在下面纠正我......