Ответ 1
Добавлена проблема на nhibernate jira
У меня есть запрос вроде этого
var orderedQueryable = this.participationRequests
.Fetch(x => x.CommunityEvent)
.Fetch(x => x.CommunityMember)
.ThenFetch(x => x.User)
.Where(x => x.CommunityMember.Community.Id == communityId)
.OrderBy(x => x.CreateDate);
Предложение where должно быть после извлечения из этой ошибки.
Проблема в том, что thouse Fetch
вызывает дополнительные объединения. В запросе SQL выглядит следующим образом:
select *
from ParticipationRequests participat0_
left outer join CommunityEvents communitye1_
on participat0_.CommunityEventId = communitye1_.Id
left outer join CommunityMembers communitym2_
on participat0_.CommunityMemberId = communitym2_.Id
left outer join Users user3_
on communitym2_.UserId = user3_.Id
inner join CommunityMembers communitym4_
on participat0_.CommunityMemberId = communitym4_.Id
inner join CommunityMembers communitym5_
on participat0_.CommunityMemberId = communitym5_.Id
inner join Communities community6_
on communitym5_.CommunityId = community6_.Id
where community6_.Id = 2002 /* @p0 */
order by participat0_.CreateDate asc
Он делает внутреннее соединение, чтобы поставить условие на CommunityId
и выполняет внешнее соединение, чтобы сделать выборку.
Я нашел аналогичный вопрос, но у моего запроса есть другой план выполнения с дополнительными объединениями и без них.
Это ошибка в провайдере LINQ? Может быть, есть обход?
Добавлена проблема на nhibernate jira
Не совсем уверен, но удалите ваш запрос и вместо этого используйте что-то в строке
join o в x.CommunityMember.Community на communityId равно x.communityMember.Community.Id(мой синтаксис compoletely out, но может служить вам в качестве подсказки)
Как упоминал Sly, это известная проблема с Linq для NHibernate.
Мне удалось обойти это, используя HQL вместо Linq. Ваш результат будет примерно таким:
CommunityEvent ce = null;
CommunityMember cm = null;
var queryable = this.participationRequests
.JoinAlias(x => x.CommunityEvent, () => ce)
.JoinAlias(x => x.CommunityMember, () => cm)
.Where(() => cm.Community.Id == communityId)
.OrderBy(x => x.CreationDate);