7
votes

Recherche floue sur un nom complet concaténé avec NHibernate

J'essaie de convertir le SQL suivant en NHibernate:

var customers = session.Query<Customer>()
    .Select( x => new { FullName = x.FirstName + " " + x.LastName, Customer = x } )
    .Where( x => x.FullName.Contains( "Bob Smith" ) )
    .Select( x => x.Customer )
    .ToList();


2 commentaires

Vous devriez utiliser restrictions.like sur une projection à l'aide d'un Concat SQLFunction. Je ne pense pas que le NH est suffisamment intelligent pour construire la projection de la concurrence à la chaîne pour vous.


MISE À JOUR: J'ai trouvé que le code NHibernate était trop désordonné dans ce cas et est simplement allé avec une procédure stockée. J'essaie vraiment d'éviter les procédures stockées autant que possible, mais il est parfois plus facile de sortir du SQL vous-même.


4 Réponses :


0
votes

Je penserais que cela ressemblerait à ceci:

.on (c => c.islike (c.firstname + '' + c.lastname))

Parce que vous ne comparez pas les bonnes valeurs comme vous l'avez maintenant.


0 commentaires

0
votes

Je peux essayer ceci:

query.Where(Restrictions.On<MyType>(x => x.Field).IsLike(StringToSearch))


0 commentaires

11
votes

NHibernate n'est pas en mesure de traduire l'expression dans une instruction SQL car on ne sait pas quoi faire avec C => C.FirstName + '' + C.LastName. Une solution peut réécrire ceci à quelque chose comme ceci: xxx


2 commentaires

J'ai réexaminé ce poste et j'ai essayé ce code et, bien que cela ne fonctionnait pas correctement, cela m'a eu sur la bonne voie pour rechercher d'autres solutions. La solution suivante d'une autre réponse Stackoverflow a parfaitement fonctionné, je pensais juste que je partageais: Stackoverflow.com/a/2937100/670028


Bonjour Randy, si vous avez travaillé, vous pouvez modifier le message pour corriger la réponse, puis le marquer comme une bonne réponse pour le partager avec le monde.



1
votes

Si vous souhaitez garder votre code aussi fortement que possible, voici comment je l'ai atteint. Je devais l'utiliser dans une disjonction. J'espère que cela aide quelqu'un!

var disjunction = new Disjunction();
var fullNameProjection = Projections.SqlFunction(
    "concat",
    NHibernateUtil.String,
    Projections.Property<UserProfile>(x => x.FirstName),
    Projections.Constant(" "),
    Projections.Property<UserProfile>(x => x.LastName)
    );
var fullNameRestriction = Restrictions.Like(fullNameProjection, searchText, MatchMode.Anywhere);
disjunction.Add(fullNameRestriction);


0 commentaires