Domanda

mi serviva per filtrare un elenco di risultati utilizzando la combinazione di due immobili. Una dichiarazione SQL pianura sarebbe simile a questa:

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

L'ICriteria in NHibernate che ho finito per usare era:

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

Funziona perfettamente, ma non sono sicuro se è la soluzione ideale visto che sto ancora imparando circa API Criteri di NHibernate. Quali sono le alternative consigliate?

  • C'è qualcosa oltre Expression.Sql che eseguire la stessa operazione? Ho provato Expression.Like, ma non riuscivo a capire come combinare i nomi e cognomi.
  • Dovrei mappare una proprietà FullName alla formula "FirstName + '' + Cognome" nella classe di mappatura?
  • Devo creare una sola lettura proprietà FullName sull'oggetto dominio, allora la mappa ad una colonna?
È stato utile?

Soluzione

Si può fare una delle seguenti:


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

Altri suggerimenti

Dal punto di vista puramente tecnico non ho una risposta, ma considerare questo: dal momento che sono disponibile un solo campo di input per l'utente di inserire il termine, non si sa se ha intenzione di inserire 'foo bar' o 'foo bar' ... quindi mi sento di raccomandare questo:

ICriteria criteria = Session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Like("FirstName",term, MatchMode.Anywhere) || Expression.Like("LastName",term, MatchMode.Anywhere));
criteria.SetMaxResults(10);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top