Nhibernate Fluent映射多个多个排序

Nhibernate Fluent映射多个多个排序,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在尝试使用流利的Nhibernate建立多对多关系 我有一个产品和一个相关产品表 Product {Id, Name...} ProductRelated{Id, ProductId, RelatedProductId, relOrder} 和产品类 映射看起来像 HasManyToMany(x => x.RelatedProducts) .Table("ProductRelated") .ReadOnly()

我正在尝试使用流利的Nhibernate建立多对多关系

我有一个
产品
和一个
相关产品

Product {Id, Name...}
ProductRelated{Id, ProductId, RelatedProductId, relOrder}
产品

映射看起来像

  HasManyToMany(x => x.RelatedProducts)
                .Table("ProductRelated")
                .ReadOnly()
                .ChildOrderBy("relOrder asc")
                .ParentKeyColumn("ProductId")
                .ChildKeyColumn("RelatedProductId");
当对
Product
进行查询并且
RelatedProducts
延迟加载时,我可以看到使用联接表上的
relOrder
正确应用了排序

Session.Query<Product>()
       .FetchMany(p => p.Categories)
       .FetchMany(p => p.Departments)
Session.Query<Product>()
       .FetchMany(p => p.Categories)
       .FetchMany(p => p.Departments)
       .FetchMany(p => p.RelatedProducts)

你知道这里发生了什么吗?

好吧,来回答你的问题,这里发生了什么?我想说,你使用的是NHibernate的“不在一起装配功能”

文档中的一个片段:

设置
order by
属性告诉NHibernate

注意:如果这些集合包含多个元素,则它们的查找操作将非常缓慢

注意:orderby属性的值是SQL排序,而不是HQL排序

因此,这只能应用于“标准”延迟加载,因为这种特性只应用于DB端。它不是内存中的管理顺序

而作为计数器部分的急切抓取是一种不同的方式,它可以生成SQL语句并向DB发出SQL语句

因此,渴望和按订购永远不会一起工作

*

我的注释:我只需要附加这个。我情不自禁

一,

急切抓取是应该避免的特性(我从不使用它,但它是我自己)。有一个更好的解决方案,它是设置
BatchSize()
,这将把1+N减少为1+(几个),并将保留所有(惰性)特性,包括
排序。如果感兴趣,请检查这些:

hasmanytomy
也支持
BatchSize()

///指定选择的批大小
///批量
公共T批处理大小(整数大小){。。。
二,

多对多
映射,虽然乍看起来很花哨,但不是我建议的方式。尝试重新思考您的模型,并介绍一级公民:
配对实体
-用于配对对象。然后它将使用
多对一
一对多
映射,这可能会给我们带来更多…例如,改进的查询子查询…尝试检查以下各项:

/// <summary>Specify the select batch size </summary>
/// <param name="size">Batch size</param>
public T BatchSize(int size) { ...