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.

War es hilfreich?

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

Mehr hier: http://devlicio.us/blogs/derik_whittaker/archive/2009/04/21/creating-a-nested-or-statement-with-nhibernate-using-the- Kriterien-convention.aspx

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top