是否可以修改查询(或映射),以便调用NHibernate的.Fetch()
扩展方法导致生成的SQL查询中的内连接?
在HQL中这很容易,您只需要编写inner join fetch
而不是left join fetch
,但我找不到Linq。
答案 0 :(得分:2)
由于这还不可能,我已经为它创建了一个Jira问题:NH-2790
答案 1 :(得分:2)
更新2:
https://www.nuget.org/packages/NHibernate.Linq.InnerJoinFetch
享受!!!
更新:
我终于成功完成了这项工作,并将追随拉动请求发送给NH团队
https://github.com/nhibernate/nhibernate-core/pull/210
事实上,它是可能的,但你需要破解NHibernate,改变的路线是这一个
tree.AddFromClause(tree.TreeBuilder.LeftFetchJoin(join, tree.TreeBuilder.Alias(alias)));
进入
tree.AddFromClause(tree.TreeBuilder.FetchJoin(join, tree.TreeBuilder.Alias(alias)));
在ProcessFetch.cs文件中
似乎Linq的行为是硬编码的,我认为它是因为它使用扩展方法来发送用于DefaultQueryProvider和re-linq处理的内容,我仍然需要弄清楚如何指定连接的类型你想要使用linq api进行热切的提取,但我正在努力,希望我会向NH团队发送一个拉取请求,这样他们就可以把它放到代码库中,现在在我的项目中我将使用我的自定义NH版
答案 2 :(得分:0)
不确定您是否可以在LINQ中控制JOIN类型,但仍然可以使用QueryOver API控制JOIN类型的强类型查询。
var ordersWithCustomers = Session.QueryOver<Order>()
.JoinQueryOver(o => o.Customer,JoinType.InnerJoin) //You can specify join type
.List();
还尝试在映射中添加not-null="true"
,尽管我只是尝试了这一点,但它对查询中的连接类型没有任何影响。
Wierdly这适用于内连接(使用旧的ANSI SQL连接语法),但不提取客户。
var ordersWithCustomers =
from o in Session.Query<Order>()
join c in Session.Query<Customer>() on o.Customer.Id equals c.Id
select o;