Question

Je suis en train de créer une clause de not in avec l'API critères NHibernate utilisant NHLambdaExtensions. La lecture de la documentation que j'ai pu mettre en œuvre la clause de in en faisant

.Add(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }))

Cependant, quand je l'enveloppe SqlExpression.Not autour Je reçois l'erreur

Error   5   The best overloaded method match for 'NHibernate.LambdaExtensions.SqlExpression.Not<oms_dal.Models.Zone>(System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>)' has some invalid arguments
Error   6   Argument '1': cannot convert from 'NHibernate.Criterion.ICriterion' to 'System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>'

J'utilise ce morceau de code

.Add(SqlExpression.Not<Zone>(SqlExpression.In<Zone>(x => zoneAlias.ZoneId, new int[] { 1008, 1010 })))

Comment puis-je y arriver? Utilisation de l'API de critères régulière, j'ai pu le faire

.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 })))
Était-ce utile?

La solution

ne ont pas travaillé avec le critère directement (je l'utilise généralement Linq2NH), mais il semble que ne veut tout simplement un lambda booléen, de sorte que vous ne pouvez pas donner un autre critère. Cela peut fonctionner, bien que je l'ai vu NH ont du mal avec les membres du groupe dans lambdas:

.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId))

EDIT: merde. Qu'est-ce qui se passe ici est que le cadre n'utilise pas réellement le lambda, donc tout ce compiles, le cadre qu'elle appelle jamais réellement dans le processus d'exécution de la requête. Il est au lieu d'examiner pensivement le MSIL de votre délégué, reverse engineering votre expression lambda et la conversion que d'une chaîne pour la commande SQL. C'est, évidemment, un processus assez complexe que les concepteurs tentent de simplifier par vous avoir spécifier des indications sur ce que vous faites (dans ce cas, le type de SqlExpression vous avez déclaré) et la recherche de modèles pour identifier le processus. Dans ce cas, cependant, même compte tenu des indices, le cadre n'a pas la moindre idée de ce que vous essayez de faire.

Si le traducteur derrière l'évaluation Non () les clauses ne peuvent pas deviner l'objet de boucles logiques ou des appels de méthode, vous pouvez bien être coincé avec

.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008
                                || z.ZoneId == 1010))

Dieu sait que je l'ai dû faire bouillir des expressions de cette façon pour Linq2NHibernate fonctionne correctement.

Autres conseils

Utilisation du vieux monde avec les lambdas semble fonctionner:

.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top