Criteri NHibernate - Come per filtrare sulla combinazione di proprietà
-
05-10-2019 - |
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 provatoExpression.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?
Soluzione
Si può fare una delle seguenti:
- Se hai sempre il lavoro con il nome completo, probabilmente è meglio avere una singola proprietà
- Creare una proprietà query unicamente a questo scopo (vedi http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx )
- la query in HQL, che è più adatto per le query a forma libera (probabilmente sarà quasi lo stesso del vostro SQL)
- Utilizza una corretta Criteri di entità-based:
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