2010-04-22 15 views
8

Ich bin NHibernate, und versuche herauszufinden, wie man eine Abfrage schreibt, die alle Namen meiner Entitäten, sucht und listet die Ergebnisse auf. Als ein einfaches Beispiel habe ich die folgenden Objekte;NHibernate Abfrage über mehrere Tabellen

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 möchte ich eine Abfrage erstellen, zum Beispiel sagen, das 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 wird:

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 so anpassen, dass die .CreateCriteria ("Dog") und .CreateCriteria ("Cat") ein OR anstelle von t generieren er UND?

danke für Ihre Hilfe.

Antwort

5

Versuchen Sie es, 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)) 
      ); 
+0

Danke, das schien es zu tun. Ich habe einen Beitrag hier gefunden: http://matthr.blogspot.com/2010/02/quey-across-join-in-nibernate.html und wollte das versuchen –

2

Sie müssen die zwei Kriterien Expression.Or (Kriterien1, Kriterien2)

Mehr hier kombinieren: http://devlicio.us/blogs/derik_whittaker/archive/2009/04/21/creating-a-nested-or-statement-with-nhibernate-using-the-criteria-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 ODER alles wollten. In diesem Fall ist es wahrscheinlich der richtige Weg, diese Kriterien zur Disjunktion hinzuzufügen, wie BuggyDigger gezeigt hat.

+0

Danke für die Antwort Alex, könnten Sie ein Beispiel geben. Ich habe versucht, was du getan hast, aber ich bekomme "kann ICriteria nicht zu Icriterion konvertieren" –

+0

In meinem Beitrag geklärt, aber da ich die Frage falsch gelesen habe, ist es vielleicht egal;) – AlexCuse

+0

Danke für Ihre Hilfe trotzdem! Habe es jetzt perfekt funktioniert! ;) –