sqlquery query icriterion c# .net linq nhibernate linq-to-nhibernate

c# - icriterion - nhibernate sql query string



LINQ to Nhibernate duplica las uniones (3)

Como Sly mencionó, este es un problema conocido con Linq a NHibernate.

Pude solucionar esto utilizando HQL en lugar de Linq. Su resultado sería algo así como:

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);

Tengo una consulta como esta

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);

La cláusula where necesita estar después de buscar debido a este error . El problema es que las llamadas a Fetch emiten uniones adicionales. En la consulta SQL tiene el siguiente aspecto:

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

Se une internamente para poner una condición en CommunityId y hace la combinación externa izquierda para realizar la búsqueda.

He encontrado una pregunta similar , pero mi consulta tiene un plan de ejecución diferente con y sin uniones adicionales.

¿Es un error en el proveedor de LINQ? Tal vez hay una solución?


No estoy seguro, pero elimine su consulta de dónde y, en su lugar, use una combinación de algo en las líneas de

unir o en x.CommunityMember.Community en communityId es igual a x.communityMember.Community.Id (mi sintaxis está completamente fuera, pero puede servirte como una pista)


Problema adicional en nhibernate jira