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