Frage

Angenommen, ich habe Klassen Foo und Bar wie folgt:

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;}
}

Nach Linq-Abfrage hat Fehler sagen, dass foo nicht eine Eigenschaft namens F1 enthält.

var query = from foo in session.Linq<Foo>()
                 select foo.ContainerBar;

query = query.Where(foo => foo.F1 == "abcdef");

Ich weiß foo in zweiter Aussage ist wirklich ein Bar weil Abfrage wählt ContainerBar.

Die Frage ist, wissen, wie kann ich eine dynamische where-Klausel zu Abfrage hinzufügen, ohne origianl Abfrage zu ändern? Endziel ist es, hat Unterabfragen mit Linq-to-nhibernate.

War es hilfreich?

Lösung

var query = from foo in session.Linq<Foo>()
                 select foo.ContainerBar;

query = query.Where(foo => foo.F1 == "abcdef");

Ihr „Abfrage“ Objekt ist jetzt ein IQueryable von ContainerBar des Also, wenn Sie das tun Wo (foo => foo.F1 == "abcdef"), es auf IQueryable getan hat, also keine F1-Eigenschaft.

Sie sollten tun:

var bars = from foo in session.Linq<Foo>()
            where foo.F1 == "abcdef"
            select foo.ContainerBar;

Oder:

var q = session.Linq<Foo>();

// if some condition
q = q.Where( foo => foo.F1 == "abcdef" );

var bars = q.Select( foo => foo.ContainerBar );

Andere Tipps

Sind Sie mit NHibernate 3.0? Die erste Abfrage funktioniert nicht für mich (NHibernate 2.1.2.4000, ungültig abgegeben). Allerdings sieht es aus wie Sie versuchen, alle Bars zu bekommen, die Foos haben, die wie dies getan werden kann ...

IQueryable<Bar> bars = Session
    .Linq<Bar>()
    .Where(bar => bar.Foos.Any());

Nun, da Sie die Bars haben, in Ihrem späteren Code können Sie F1 überprüfen, wie diese ...

var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top