LINQ to Nhibernate объединяет дубликаты - PullRequest
15 голосов
/ 16 ноября 2011

У меня такой запрос

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 должно быть после выборки из-за этой ошибки . Проблема в том, что эти 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? Может быть, есть обходной путь?

Ответы [ 3 ]

4 голосов
/ 12 апреля 2012
1 голос
/ 14 января 2014

Как уже упоминал Хитрый, это известная проблема с 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);
1 голос
/ 22 ноября 2011

Не совсем уверен, но удалите ваш запрос where и вместо этого используйте что-то в строках

join o в x.CommunityMember.Community для communityId равно x.communityMember.Community.Id (мой синтаксис comp0letely, но может служить вам подсказкой)

...