Nhibernate Linq查询中的内部联接获取

Nhibernate Linq查询中的内部联接获取,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,是否可以修改查询(或映射),以便调用NHibernate的.Fetch()扩展方法在生成的SQL查询中产生内部联接 在HQL中,这很简单,您只需编写内部连接获取而不是左连接获取,但对于Linq,我找不到这一点。不确定是否可以在Linq中控制连接类型,但仍然可以使用QueryOver API使用强类型查询控制连接类型 var ordersWithCustomers = Session.QueryOver<Order>() .JoinQueryOver(o => o.Custo

是否可以修改查询(或映射),以便调用NHibernate的
.Fetch()
扩展方法在生成的SQL查询中产生内部联接


在HQL中,这很简单,您只需编写
内部连接获取
而不是
左连接获取
,但对于Linq,我找不到这一点。

不确定是否可以在Linq中控制连接类型,但仍然可以使用QueryOver API使用强类型查询控制连接类型

var ordersWithCustomers = Session.QueryOver<Order>()
  .JoinQueryOver(o => o.Customer,JoinType.InnerJoin) //You can specify join type
  .List();

由于这还不可能,我为它创建了一个Jira问题:

更新2:

享受

更新:

我最终设法做到了这一点,并向NH团队发送了以下pull请求


事实上,这是可能的,但你需要破解NHibernate,改变的路线是这一条

tree.AddFromClause(tree.TreeBuilder.LeftFetchJoin(join, tree.TreeBuilder.Alias(alias)));
进入

在ProcessFetch.cs文件中


行为似乎是针对Linq硬编码的,我认为这是因为它使用扩展方法来发送用于DefaultQueryProvider和重新Linq处理的内容,我仍然需要弄清楚如何指定在使用Linq api进行急切抓取时要执行的连接类型,但我正在研究它,希望我能向NH团队发送一个pull请求,这样他们就可以将其放入代码库中,因为现在在我的项目中,我将使用我的定制NH版本

感谢QueryOver建议,至少这比HQL更安全。我还尝试了
not null=“true”
,正如您所说,这并没有改变任何事情。只是用LINQ表达式语法示例进行了更新,尽管这并不能解决问题,但可能会给您带来另一个想法。我尝试了与
Fetch()
相结合的方法。似乎可以工作,但会产生非常丑陋和低效的SQL(类似于
Order left join OrderJoinTable left join OrderJointTable2,Customer left join OrderJoinTable left join OrderJointTable2,其中Order.ID=Customer.ID
其中OrderJointTables来自实体中的我的元素).我感觉这里的答案是,您不能使用NHibernate中的LINQ API强制进行
内部连接。我想这是否是bug是有争议的。很好的扩展,但我们使用的是nhibernate 4,当我将它添加到项目中时,nuget将nhibernate设置为3.3。有没有办法为nhibernate的当前版本提供新版本?或者我如何将其添加到我的项目中?
tree.AddFromClause(tree.TreeBuilder.LeftFetchJoin(join, tree.TreeBuilder.Alias(alias)));
tree.AddFromClause(tree.TreeBuilder.FetchJoin(join, tree.TreeBuilder.Alias(alias)));