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

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.

¿Fue útil?

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"));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top