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.

È stato utile?

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"));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top