Dynamische Linq-to-nhibernate Abfrage Problem
-
30-09-2019 - |
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.
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"));