NHibernate – einfachste Möglichkeit, eine LIKE-Suche anhand einer Integer-Spalte mit der Criteria API durchzuführen?
-
22-07-2019 - |
Frage
Ich versuche, eine Like-Suche für eine Integer-Spalte durchzuführen. Ich muss die Spalte tatsächlich in einen Varchar-Wert umwandeln und dann die Like-Suche durchführen.Ist das möglich?Was ist der einfachste Weg, dies mit der Kriterien-API zu tun?
var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))
Lösung
Wenn Number eine Zeichenfolge wäre, wäre es einfach:
.Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))
Da Sie eine Zahl haben, prüft NHibernate den Typ der Zahl und wenn Sie ihr eine Zeichenfolge geben, wird eine Ausnahme ausgelöst.
Ich bin mir nicht sicher, warum das NH-Team keine Überladung mit Objekt als Parameter und MatchMode-Parametern bereitgestellt hat ....
Wie auch immer, Sie können es immer noch so machen:
.Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))
Bearbeiten
Über den Alias:
(Ich kann nicht finden, wo in der Dokumentation darüber gesprochen wird, aber hier ist mein Verständnis davon)
{alias} gibt den Alias zurück, der von NH für die neueste CreateCriteria verwendet wird.Wenn Sie also Folgendes hätten:
session.CreateCriteria<User>("firstAlias")
.CreateCriteria("firstAlias.Document", "doc")
.Add(Expression.Sql("{alias}.Number like ?", "%2%",
NHibernateUtil.String)).List<User>();
{alias} wäre in diesem Fall „doc“ – Sie würden also am Ende Folgendes erhalten:doc.Nummer .
Verwenden Sie daher immer {alias} nach der CreateCriteria, deren Alias Sie verwenden müssen.