2016-05-13 20 views
1

In Ordnung, lange Zeit Hörer, zum ersten Mal Anrufer.Queryover - QueryOver mit Eigenschaft und Eigenschaft der Referenz in der gleichen Disjunktion

Ich versuche, eine Abfrage mithilfe der QueryOver API zu erstellen, die nach einer Anzahl von Begriffen über bestimmte Eigenschaften meiner Entität sucht. Das Problem besteht darin, dass einige dieser Eigenschaften Verweise auf eine andere Entität sind. Ich muss jedoch immer noch nach dem gegebenen Begriff in einer Eigenschaft dieser Referenz suchen.

Ich möchte in der Lage sein, etwas wie den Code unten zu schreiben. Im folgenden Code sind FirstName, MiddleName und LastName grundlegende Zeichenfolgeneigenschaften für die Entität Person. Die Eigenschaft Abteilung ist eine Referenzeigenschaft des Typs Abteilung. Die Abteilung Entität hat drei Eigenschaften: ID, Wert, Beschreibung. Es ist Person.Department.Value, der mit den Grundeigenschaften auch nach dem gegebenen Begriff gesucht werden muss.

var queryOver = session.QueryOver<Person>(); 
foreach (string term in searchTerms) 
{ 
    queryOver = queryOver.Where(Restrictions.On<Person>(x => x.FirstName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        Restrictions.On<Person>(x => x.LastName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        Restrictions.On<Person>(x => x.MiddleName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        //This following line doesn't work. 
        Restrictions.On<Person>(x => x.Department.Value).IsInsensitiveLike(term, MatchMode.Anywhere) 
} 

habe ich versucht, mit Alias-Namen und mit dem NHibernate.Linq/Query-API. Ich weiß, dass ich mich mit einem Alias ​​verbinden muss, aber ich glaube, ich verstehe nicht alle Fragen/Artikel, die ich gelesen habe. Die meisten von ihnen scheinen über eine Abfrage/Unterabfrage gegen die Referenz oder Child zu sprechen, aber ich habe Probleme, diese Abfragen in eine Abfrage neben anderen Eigenschaften zu übersetzen und sie alle zusammen zu ordern.

Die letzte SQL ich für etwas ist wie das Schießen bin:

SELECT * 
FROM `persons` 
WHERE (`FirstName` LIKE '%term1%' OR 
     `LastName` LIKE '%term1%' OR 
     `MiddleName` LIKE '%term1%' OR 
     `Department`.`Value` LIKE '%term1%') AND //I know this won't work 
     (`FirstName` LIKE '%term2%' OR 
     `LastName` LIKE '%term2%' OR 
     `MiddleName` LIKE '%term2%' OR 
     `Department`.`Value` LIKE '%term2%') AND etc... 

Schließlich vielen Dank im Voraus für jede Hilfe. Ich bin offen für die Verwendung einer anderen API in NHibernate oder sogar eine andere Suchstrategie, wenn Sie denken, dass ich die gleichen Ergebnisse mit einer anderen Abfrage erzielen kann.

Antwort

0

In Ordnung, ich habe es endlich herausgefunden. Dank diese Beiträge für mich in der richtigen Richtung:

QueryOver Or with Subquery

Filtering and projecting an association using NHibernate QueryOver

Hier ist der Code, kam ich mit zu tun, was ich brauchte. Ich wollte wirklich keine hässlichen Aliase mit zufälligen Variablen verwenden, die auf null gesetzt waren, und ich wollte auch nicht, dass eine ganze Reihe anderer Abfragen an anderer Stelle definiert wurde. Ich kann weiter erklären, wenn jemand es braucht.

var persons = session.QueryOver<Person>() 
       .Where(Restrictions.Disjunction() 
        .Add(Subqueries.WhereProperty<Person>(x => x.Department.Id).In(QueryOver.Of<Department>().WhereRestrictionOn(x => x.Value).IsInsensitiveLike("somedep", MatchMode.Anywhere).Select(x => x.Id))) 
        .Add<Person>(x => x.LastName.IsInsensitiveLike("somedep", MatchMode.Anywhere))) 
       .Where(Restrictions.Disjunction() 
        .Add(Subqueries.WhereProperty<Person>(x => x.Department.Id).In(QueryOver.Of<Department>().WhereRestrictionOn(x => x.Value).IsInsensitiveLike("myname", MatchMode.Anywhere).Select(x => x.Id))) 
        .Add<Person>(x => x.LastName.IsInsensitiveLike("myname", MatchMode.Anywhere)))) 
       .List();