Linq查询中的内连接提取

时间:2011-07-08 09:48:08

标签: nhibernate linq-to-nhibernate

是否可以修改查询(或映射),以便调用NHibernate的.Fetch()扩展方法导致生成的SQL查询中的内连接?

在HQL中这很容易,您只需要编写inner join fetch而不是left join fetch,但我找不到Linq。

3 个答案:

答案 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;