2009-08-20 7 views
1

En ce moment, j'ai quelque chose comme ça dans NHibernate:IFNULL dans NHibernate

Expression.Like(property, value, MatchMode.Anywhere) 

et qui génère SQL comme:

property LIKE '%value%' 

qui est très bien pour ce cas. Dans un autre cas, je veux que le SQL:

IFNULL(property LIKE '%value%', 0) 

mais je ne vois aucun exemple dans le manuel qui fait référence à IFNULL, et je ne peux même trouver des « API docs plain-ol.

J'ai trouvé Expression.Sql(), mais seulement un exemple dans le manuel, et ça me fait un peu peur d'utiliser quelque chose pour lequel je n'ai pas vu de vrai document, et de faire moi-même quelque chose avec SQL quand j'utilise NHibernate pour essayer d'échapper à ça.

Existe-t-il une meilleure façon de faire IFNULL dans NHibernate que Expression.Sql()?

+1

En marge, vous devez utiliser soudent comme c'est ansi norme tout en isnull est spécifique t-sql. –

+0

Je ne sais pas ce que "t-sql" est mais je vais prendre note de cela. Merci! – Ken

+0

t-sql est transact sql, est le dialecte particulier de sql utilisé par microsoft sql server et sybase. –

Répondre

2

Je suppose que c'est dans une clause WHERE, à quel point IFNULL(property LIKE '%value%', 0) n'est pas valide SQL puisque LIKE évalue à vrai ou faux, et 0 n'est ni l'un ni l'autre.

Je suppose que vous voulez réellement property LIKE '%value%' OR property IS NULL?

Si tel est le cas:

.Add(
    Expression.Disjunction() 
    .Add(Expression.Like(property, value, MatchMode.Anywhere)) 
    .Add(Expression.IsNull(property)) 
) 
+0

Je pense que vous vouliez dire AND NOT NULL au lieu de OR NULL, mais j'ai été capable d'utiliser cette stratégie pour faire une expression qui fonctionne pour moi. – Ken

+0

Si vous ne vouliez pas de null, pourquoi utiliseriez-vous même coalesce de toute façon? Vous pourriez juste utiliser le LIKE puisque cela ne correspondrait jamais à une valeur nulle et donc x LIKE 'value' ET x IS NOT NULL est exactement le même que si vous supprimiez l'IS NOT NULL. –

+0

Parce que "COALESCE (x LIKE y, false)" me semble beaucoup plus simple et plus direct que "(x LIKE y) ET (x EST NOT NULL)". Et en utilisant simplement "x LIKE y" donne NULL quand x = NULL qui est complètement différent - en particulier, lorsqu'il est utilisé dans un Expression.Not(), NULL est toujours NULL. – Ken

0

Ce n'est pas une réponse en soi mais je vous suggère de rechercher COALESCE(). Here vous pouvez voir pourquoi.

+0

C'est génial, et si jamais je veux utiliser ISNULL (ce que je ne suis pas, ici), je serai sûr de le vérifier. :-) – Ken