7
votes

NHibernate produit SQL avec une mauvaise jointure

J'ai une requête de NHibernate Linq qui ne fonctionne pas comment j'attendrais.

Le problème semble provenir d'une colonne INT nullable à partir d'une table jointe gauche dans la clause WHERE. Cela provoque la jointure pour agir comme une join interne. P> xxx pré>

Le SQL produit par ceci ressemble à (à partir de la jointure à partir de l'emploi - vous n'avez pas besoin de voir tous les SELECTS ) P>

        Table("Kctc.WorkflowCaseView");
        Id(x => x.Id).Column("CaseId");
        Map(x => x.MooseUserId).Nullable();


0 commentaires

3 Réponses :


3
votes

Je pense que vous devez modifier votre où CODE> Clause CODE> à ceci:

.Where(x => x.AssignedUser.Id == userId || 
       (x.CaseView != null && x.CaseView.MooseUserId == userId))


3 commentaires

Merci pour la réponse rapide. J'ai essayé votre suggestion (et j'avais montré la même chose moi-même, tout simplement en utilisant .Hasvalue au lieu de! = Null) et cela n'a pas aidé.


@Markwitherers: Que se passe-t-il si vous supprimez complètement cette pièce du clause? Comment votre mappage entre WorkflowCasasaction et WorkflowCaseView ?


Si je supprimais "|| x.caseview.mooseuserid == userid" de la clause O quelle que soit la clause, il ramène des actions sans records de cas et utilise trois jointures extérieures gauche comme je m'attendrais.



0
votes

J'ai mis en œuvre cette jointure en utilisant une procédure stockée. Espérons que NHibernate réparera ce bogue bientôt.


0 commentaires

0
votes

Essayez d'utiliser NHibernate fluide. Quelque chose comme ce qui suit devrait vous mettre dans le parc Ballon Ball: XXX

Gardez à l'esprit, j'ai une classe spéciale qui s'étend sur fluentessionmanager.getsession () où je peux l'appeler directement avec un simple assistant classe ou sur une page par page de page. Votre configuration de la fluentessionManager peut être considérablement différente. Mais finalement à ".Createcreeciteria () ..." Votre code et le mien devraient correspondre. En supposant que la "flux de travail" est la table que la requête est appelée contre.


0 commentaires