Dinámica LINQ a nhibernate problema de consulta
-
30-09-2019 - |
Pregunta
Supongamos que tengo clases Foo
y Bar
de la siguiente manera:
public class Foo
{
public string F1 {set; get;}
public string F2 {set; get;}
public Bar ContainerBar {set; get;}
}
public class Bar
{
public string B1 {set; get;}
public string B2 {set; get;}
public List<Foo> Foos {set; get;}
}
Tras consulta LINQ tiene errores diciendo que foo
no contiene una propiedad denominada F1
.
var query = from foo in session.Linq<Foo>()
select foo.ContainerBar;
query = query.Where(foo => foo.F1 == "abcdef");
Sé foo
en la segunda declaración es realmente un Bar
porque ContainerBar
consulta selecciona.
La cuestión es saber cómo puedo añadir una dinámica en la que la cláusula de consulta sin cambiar la consulta del origianl? objetivo final es tener sub-consultas con LINQ a nhibernate.
Solución
var query = from foo in session.Linq<Foo>()
select foo.ContainerBar;
query = query.Where(foo => foo.F1 == "abcdef");
Su objeto "consulta" es ahora un IQueryable de ContainerBar de Así que cuando usted hace la Dónde (foo => foo.F1 == "abcdef"), se hace en IQueryable, por lo que ninguna propiedad F1.
Usted debe hacer:
var bars = from foo in session.Linq<Foo>()
where foo.F1 == "abcdef"
select foo.ContainerBar;
O:
var q = session.Linq<Foo>();
// if some condition
q = q.Where( foo => foo.F1 == "abcdef" );
var bars = q.Select( foo => foo.ContainerBar );
Otros consejos
¿Está utilizando NHibernate 3.0? La primera consulta no funciona para mí (NHibernate 2.1.2.4000, reparto no válido). Sin embargo, parece que está tratando de obtener todos los bares que tienen Foos, que puede ser hecho como este ...
IQueryable<Bar> bars = Session
.Linq<Bar>()
.Where(bar => bar.Foos.Any());
Ahora que tiene los bares, en su código más tarde se puede comprobar F1 como este ...
var result = bars
.Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));