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> 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();
3 Réponses :
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))
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 où code> clause? Comment votre mappage entre
WorkflowCasasaction code> et
WorkflowCaseView code>?
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.
J'ai mis en œuvre cette jointure en utilisant une procédure stockée. Espérons que NHibernate réparera ce bogue bientôt. P>
Essayez d'utiliser NHibernate fluide. Quelque chose comme ce qui suit devrait vous mettre dans le parc Ballon Ball: 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. P> p>