2011-01-16 9 views
11

Estoy tratando de ejecutar esta consulta LINQ a continuación con NHibernate 3.NHibernate 3 - combinación izquierda re-solución LINQ

var items = from c in session.Query<tbla>() 
     join t in session.Query<tblb>() on c.Id equals t.SomeId into t1 // use left join on trades. 
     from t2 in t1.DefaultIfEmpty() 
select new {item = c, desc = t2.Description}; 

Ésta es la manera de llevar a cabo una izquierda unirse en LINQ, que yo sepa. Sin embargo, me está dando un mensaje de excepción no compatible. ¿Cómo puedo lograr una combinación izquierda básica sin recurrir a HQL? Esto parece un poco tonto que un ORM tan frecuente como nHibernate no pueda soportar algo tan peatonal como un join de izquierda.

[editar]

he puesto la verdadera respuesta a mi propia pregunta a continuación.

+0

Estoy perdido. ¿Dónde están los equivalentes para "en c.Id es igual a t.SomeId into t1" y "new {item = c, desc = t2.Description}" en el ejemplo? ¿Podría extender el ejemplo y/o los comentarios? – mayu

+0

La respuesta aceptada es incorrecta. ¿Por qué no envías tu propia respuesta? Yo votaría por eso. – mayu

+0

Buena llamada He movido mi edición a una respuesta. La magia de unión ocurre en la cláusula 'SelectList' de esa expresión. Espero que eso ayude. La segunda consulta no es una lógica de coincidencia exacta para la primera consulta, por lo que no hay comparación de manzana a manzana allí. – James

Respuesta

8

Después de más investigaciones sobre esto; esto es posible (aunque no obvio) para lograr de una manera fuertemente tipada usando QueryOver. El truco consiste en usar variables externas de alias de consulta junto con WithAlias ​​y TransformUsing. Aquí hay un ejemplo que se une con el filtrado y la clasificación.

// Query alias variables 
entityTypeA anchorType = null; 
entityTypeB joinedType = null; 

var items = session.Query<entityTypeA>(()=>anchorType) 
      .Left.JoinAlias(() => anchorType.FieldName,() => joinedType) 
      .WithSubquery.WhereProperty(e => e.FieldD).In(myFilterList) 
      // bind property mappings using WithAlias 
      .SelectList(list => list 
         .Select(e => e.FieldNameA).WithAlias(()=> anchorType.FieldNameA) 
         .Select(e => e.FieldNameB).WithAlias(()=> anchorType.FieldNameB) 
         ) 
      .OrderBy(e => joinedType.FieldNameC).Desc 
      .TransformUsing(Transformers.AliasToBean<entityTypeA>()) // transform result to desired type. 
      .List<entityTypeA>(); 
+1

Hay un problema con ese enfoque: su entidad recuperada en realidad se comporta como un DTO (es decir, no se rastrea) –

+0

Entonces, si necesitan ser actualizada esta solución no funcionará? –

1

Aún no es compatible. HQL es tu única opción en este momento.

+0

Gracias, tenía miedo de eso. ¿Existe quizás otra forma alternativa de no hql de hacer esto, es decir, subconsulta con w/where outer clause, etc.? – James

+1

Tal vez ... pero usaría un HQL simple en lugar de un LINQ complejo ... –

Cuestiones relacionadas