sqlquery query icriterion linq nhibernate fluent-nhibernate linq-to-nhibernate

query - Linq Nhibernate se unió a la izquierda



nhibernate sql query string (1)

No se puede hacer con el proveedor de LINQ, pero puede hacerlo con QueryOver. Algo como:

MemberTheft memberAlias = null; var result = Session.QueryOver<Theft>() .Left.JoinQueryOver(x => x.action, () => memberAlias) .Where(() => memberAlias.memberId == member.id);

Editar: consulta actualizada.

A Theft tiene una propiedad de acción

Esta es la consulta que estoy tratando de obtener NHibernate.Linq para producir:

SELECT * FROM `thefts` LEFT JOIN memberThefts ON thefts.id = memberThefts.theftId AND memberThefts.memberId = 1

Quiero obtener una lista de todos los robos donde action.memberId == algún número o simplemente nulo si no encuentra una fila, simple como una consulta pero me ha estado dando una pesadilla todo el día.

thefts = session.Query<Theft>() .Fetch(x => x.action) .Where(x => x.action.memberId == member.id) .ToList();

Esto ejecuta el siguiente SQL:

select theft0_.id as id9_0_, memberthef1_.memberId as memberId7_1_, theft0_.name as name9_0_, theft0_.chance as chance9_0_, memberthef1_.theftId as theftId7_1_, memberthef1_.availableTime as availabl3_7_1_ from thefts theft0_ left outer join memberThefts memberthef1_ on theft0_.id = memberthef1_.theftId, memberThefts memberthef2_ where theft0_.id = memberthef2_.theftId and memberthef2_.memberId =1 /* ?p0 */

La clase de robo:

public class Theft { public virtual byte id { get; set; } public virtual string name { get; set; } public virtual byte rank { get; set; } public virtual byte chance { get; set; } public virtual MemberTheft action { get; set; } ...

Y es mapeo:

public TheftMap() { Table("thefts"); Id(x => x.id); Map(x => x.name); Map(x => x.id); Map(x => x.chance); References(x => x.action) .Nullable() .PropertyRef(x => x.theftId) .Column("id"); }

Cualquier solución hará HQL, QueryOver, etc.