Frage

Ich brauchte eine Liste der Ergebnisse zu filtern, um die Kombination von zwei Eigenschaften verwenden. Eine einfache SQL-Anweisung würde wie folgt aussehen:

SELECT TOP 10 *
FROM Person
WHERE FirstName + ' ' + LastName LIKE '%' + @Term + '%'

Die ICriteria in NHibernate, dass ich am Ende mit war:

ICriteria criteria = Session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Sql(
    "FirstName + ' ' + LastName LIKE ?",
    "%" + term + "%",
    NHibernateUtil.String));
criteria.SetMaxResults(10);

Es funktioniert perfekt, aber ich bin nicht sicher, ob es die ideale Lösung, da ich noch über NHibernate Criteria API lerne. Was sind die empfohlenen Alternativen?

  • Gibt es etwas anderes als Expression.Sql, die die gleiche Operation durchführen würde? Ich habe versucht, Expression.Like kann aber nicht herausfinden, wie der Vor- und Nachnamen zu verbinden.
  • Should I Karte eine Fullname-Eigenschaft der Formel "Vorname + '' + Name" in der Mapping-Klasse?
  • Sollte ich einen Nur-Lese Fullname-Eigenschaft auf dem Domäne-Objekt wo es dann auf eine Säule?
War es hilfreich?

Lösung

Sie können eine der folgenden tun:

  • Wenn Sie immer die Arbeit mit dem vollständigen Namen, ist es wahrscheinlich am besten, eine einzige Eigenschaft haben,
  • Erstellen Sie eine Abfrage-Unterkunft, die nur für diesen Zweck (siehe http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx )
  • Sie die Abfrage in HQL, die besser für Freiform-Abfragen geeignet ist (es wird wahrscheinlich fast die gleiche wie Ihre SQL sein)
  • verwenden, um ein richtiges Einheit-basierten Kriterien:

Session.CreateCriteria<Person>()
       .Add(Restrictions.Like(
            Projections.SqlFunction("concat",
                                    NHibernateUtil.String,
                                    Projections.Property("FirstName"),
                                    Projections.Constant(" "),
                                    Projections.Property("LastName")),
            term,
            MatchMode.Anywhere))

Andere Tipps

Auf der rein technischen Seite, ich habe keine Antwort, aber bedenken Sie: da Sie nur ein einziges Eingabefeld für den Benutzer den Begriff eingeben müssen, sind, weiß man nicht, ob er ‚foo bar‘ oder ‚bar foo‘ eingeben wird ... also ich würde dies empfehlen:

ICriteria criteria = Session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Like("FirstName",term, MatchMode.Anywhere) || Expression.Like("LastName",term, MatchMode.Anywhere));
criteria.SetMaxResults(10);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top