一些快速的nhibernate问题:
我有sql表:
Item { Id, Name }
ItemRange { Id, Name }
ItemHasItemRange { Id, ItemId, ItemRangeId }
映射很简单,所以我不会粘贴它们,ItemId和ItemRangeId是外键,Item类将ItemHasItemRanges集合映射为lazy bag。
我想要所有特别是ItemRange的项目,但我不想检索关联的ItemRangeObjects,我只是想做内连接以缩小结果。
当我这样做的时候:
c.CreateCriteria("Item", "i")
.CreateAlias("ItemHasItemRanges", "ihpr", JoinType.InnerJoin)
.Add(Restrictions.Eq("ihpr.ItemRange.Id", I18nHelper.CurrentItemRange.Id));
它工作正常,但所有 ItemHasItemRange 对象也被提取到 Item.ItemHasItemRanges 集合(被映射为惰性)
我不想获取Item.ItemHasItemRanges,因为它需要时间。我只是想做内连接来限制结果集。在NHibernate中有可能吗?
答案 0 :(得分:0)
所以我认为你只是想要检索这些对象以显示概述/列表,而你实际上不会对这些对象“做”某些事情(除非加载其中一个)?
在这种情况下,我认为您最好使用“预测”。 这是场景:
你必须创建一个(简单)类,它只包含你想要显示的属性(你感兴趣的地方)。
你必须将该类“导入”NHibernate,以便NHibernate知道它的存在。
接下来,您可以像现在一样创建Criteria语句。 (使用您的域类)。
然后,您应该指定投影的外观。也就是说,Item
实体的属性如何映射到'DTO'/ View类的属性(=您刚刚创建的简单类)。
指定应使用AliasToBean
ResultTransformer。
然后,执行您的Criteria查询。 NHibernate将能够生成所需的最简单的查询,以便检索所有必要的数据。
我已经解释过类似的here
答案 1 :(得分:0)
我发现问题出在其他地方。 ItemHasItemRange表在ItemId和ItemRangeId上没有多个索引 - id在每个字段上只有单独的索引。这就是为什么表现如此糟糕。
但NHibernate问题仍然有效 - 是否可以为条件创建内连接以缩小结果,而不是获取通常是懒惰的所有连接对象。