NHibernate-Abfrage über mehrere Tabellen
-
01-10-2019 - |
Frage
Ich verwende NHibernate, und ich versuche, herauszufinden, wie eine Abfrage zu schreiben, dass searchs alle Namen meiner Entitäten, und listet die Ergebnisse. Als einfaches Beispiel habe ich die folgenden Objekte;
public class Cat {
public string name {get; set;}
}
public class Dog {
public string name {get; set;}
}
public class Owner {
public string firstname {get; set;}
public string lastname {get; set;}
}
Eventaully mag ich eine Abfrage erstellen, zum Beispiel sagen, welche und gibt alle Besitzer von Haustieren mit einem Namen „ted“ oder Haustiere mit einem Namen mit „ted“ enthalten.
Hier ist ein Beispiel für die SQL I ausgeführt werden soll:
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
OR c.name like '%ted%'
OR d.name like '%ted%'
Wenn ich es Kriterien wie folgt aus:
var criteria = session.CreateCriteria<Owner>()
.Add(
Restrictions.Disjunction()
.Add(Restrictions.Like("FirstName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("LastName", keyword, MatchMode.Anywhere))
)
.CreateCriteria("Dog").Add(Restrictions.Like("Name", keyword, MatchMode.Anywhere))
.CreateCriteria("Cat").Add(Restrictions.Like("Name", keyword, MatchMode.Anywhere));
return criteria.List<Owner>();
Die folgende Abfrage generiert:
SELECT TOP 10 d.*, c.*, o.* FROM owners AS o
INNER JOIN dogs AS d ON o.id = d.ownerId
INNER JOIN cats AS c ON o.id = c.ownerId
WHERE o.lastname like '%ted%'
OR o.firstname like '%ted%'
AND d.name like '%ted%'
AND c.name like '%ted%'
Wie kann ich meine Abfrage einstellen, so dass der .CreateCriteria ( „Hund“) und .CreateCriteria ( „Katze“) erzeugen eine oder anstelle der UND?
Danke für Ihre Hilfe.
Lösung
Versuchen Sie dieses, es könnte funktionieren.
var criteria = session.CreateCriteria<Owner>()
.CreateAlias("Dog", "d")
.CreateAlias("Cat", "c")
.Add(
Restrictions.Disjunction()
.Add(Restrictions.Like("FirstName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("LastName", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("c.Name", keyword, MatchMode.Anywhere))
.Add(Restrictions.Like("d.Name", keyword, MatchMode.Anywhere))
);
Andere Tipps
Sie müssen die zwei Kriterien Expression.Or (Kriterien1, Kriterien2) kombinieren
Hmm ich denke, es wie folgt aus (entlehnt etwas von BuggyDigger Code) aussehen würde
var criteria = session.CreateCriteria<Owner>()
.CreateAlias("Dog", "d")
.CreateAlias("Cat", "c")
.Add(Expression.Or(Expression.Like("c.Name", keyword, MatchMode.Anywhere)
, Expression.Like("d.Name", keyword, MatchMode.Anywhere))
);
Aber ich habe nicht bemerkt, dass Sie OR alles wollte. In diesem Fall dieser Kriterien die Disjunktion Zugabe, wie BuggyDigger zeigte, ist wahrscheinlich der Weg zu gehen.