NHibernate: il modo più semplice per eseguire una ricerca LIKE su una colonna intera con API Criteria?
-
22-07-2019 - |
Domanda
Sto provando a fare una ricerca simile contro una colonna intera, quello che devo fare è in realtà lanciare la colonna su un varchar e quindi fare la ricerca simile. È possibile? qual è il modo più semplice per farlo utilizzando l'API Criteria?
var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))
Soluzione
Se Numero fosse una stringa, sarebbe facile:
.Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))
Dato che hai un numero, NHibernate controllerà il tipo di numero e se gli dai una stringa genererà un'eccezione.
Non so perché il team NH non abbia fornito un sovraccarico con oggetto come parametro e parametri MatchMode ....
Ad ogni modo, puoi ancora farlo in questo modo:
.Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))
Modifica
Informazioni sull'alias:
(non riesco a trovare dove la documentazione parla di questo, ma ecco la mia comprensione di esso)
{alias} restituisce l'alias utilizzato all'interno da NH per il più recente CreateCriteria. Quindi se avessi:
session.CreateCriteria<User>("firstAlias")
.CreateCriteria("firstAlias.Document", "doc")
.Add(Expression.Sql("{alias}.Number like ?", "%2%",
NHibernateUtil.String)).List<User>();
{alias} in questo caso sarebbe 'doc' - quindi finiresti con: doc.Number.
Quindi, usa sempre {alias} dopo CreateCriteria di cui devi usare l'alias.