Выборка внутреннего соединения в запросе Linq - PullRequest
3 голосов
/ 08 июля 2011

Можно ли изменить запрос (или отображение) так, чтобы вызов метода расширения .Fetch() NHibernate приводил к внутреннему соединению в сгенерированном запросе SQL?

В HQL это легко, нужно просто написать inner join fetch вместо left join fetch, но я не смог найти это для Linq.

Ответы [ 3 ]

2 голосов
/ 14 июля 2011

Поскольку это пока невозможно, я создал для нее проблему Jira: NH-2790

2 голосов
/ 15 июня 2013

ОБНОВЛЕНИЕ 2:

https://www.nuget.org/packages/NHibernate.Linq.InnerJoinFetch

Наслаждайтесь !!!

UPDATE:

Мне, наконец, удалось это сделать, и я отправил запрос на повторное получение команды 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

0 голосов
/ 08 июля 2011

Не уверен, что вы можете контролировать тип JOIN в LINQ, но у вас все еще могут быть строго типизированные запросы, управляющие типом JOIN с использованием API QueryOver.

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

Также попробуйте добавить not-null="true" в ваше отображение,хотя я только что попробовал это, и это не имело значения для типа соединения в запросе.

Странно, это работает для внутреннего соединения (используя старый синтаксис соединения ANSI SQL), но не выбирает Customer.

var ordersWithCustomers = 
   from o in Session.Query<Order>()
   join c in Session.Query<Customer>() on o.Customer.Id equals c.Id
   select o;
...