Dinamica LINQ to NHibernate problema interrogazione
-
30-09-2019 - |
Domanda
Supponiamo che io sono classi Foo
e Bar
come segue:
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;}
}
A seguito di query LINQ ha errori dicendo che foo
non contiene una proprietà denominata F1
.
var query = from foo in session.Linq<Foo>()
select foo.ContainerBar;
query = query.Where(foo => foo.F1 == "abcdef");
Lo so foo
in seconda affermazione è in realtà un Bar
perché ContainerBar
query seleziona.
La questione è sapere come posso aggiungere una dinamica in cui la clausola di query senza cambiare interrogazione origianl? Obiettivo finale è quello di avere sub-query con LINQ to NHibernate.
Soluzione
var query = from foo in session.Linq<Foo>()
select foo.ContainerBar;
query = query.Where(foo => foo.F1 == "abcdef");
Il vostro "query" è oggi un IQueryable di ContainerBar di Così, quando si fa il Dove (foo => foo.F1 == "abcdef"), è fatto su IQueryable, quindi nessuna proprietà F1.
Si dovrebbe fare:
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 );
Altri suggerimenti
Stai usando NHibernate 3.0? La prima query non funziona per me (NHibernate 2.1.2.4000, il cast non valido). Tuttavia, sembra che si sta cercando di ottenere tutti i bar che hanno Foos, che può essere fatto in questo modo ...
IQueryable<Bar> bars = Session
.Linq<Bar>()
.Where(bar => bar.Foos.Any());
Ora che avete i bar, nel codice in seguito è possibile controllare F1 come questo ...
var result = bars
.Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));