NH QueryOver – utilise les propriétés de la requête principale dans une sous-requête

J’essaie de convertir le code SQL suivant en QueryOver:

Select 1 From myTable mt Where mt.ForeignKey in (select ID from otherTable ot where ot.ID = R.ID) 

Je souhaite utiliser cette sous-requête dans une instruction EXISTS / NOT EXISTS comme:

 select * from table R where .... AND EXISTS (query above) 

Actuellement, j’ai quelque chose comme:

 mainQuery.WithSubquery.WhereExists(QueryOver.Of() .Where(mt => mt.ForeignKey) .WithSubquery.IsIn(QueryOver.Of().Where(c => c.Id == R.SomeId))); 

J’ai créé cette requête en tant que sous-requête que je souhaite connecter à la requête principale. Le problème est que la table alias R étant la table appelée par la requête principale et que je ne sais pas comment accéder aux colonnes de la table (modèle NHibernate) R (qui n’est pas accessible dans la requête ci-dessus), ma question est donc: :

Comment puis-je obtenir des valeurs de la requête principale et les utiliser dans une sous-requête. Je pense que cela n’est possible qu’en créant la sous-requête en ligne (comme dans mainQuery.WithSququery.Where (..) ou similaire.), Mais je ne vois pas quel serait le meilleur moyen de le faire. J’apprécie toute aide!

Merci d’avance!

L’astuce consiste à utiliser le bon alias, pour la requête parent:

 // the alias myTable R = null; mainQuery .WithSubquery .WhereExists(QueryOver .Of( () => R) // the Alias in place .Where(mt => mt.ForeignKey) .WithSubquery.IsIn(QueryOver.Of().Where(c => c.Id == R.SomeId))); 

Notez que vous n’êtes pas tout à fait sûr de la partie mainQuery, mais la solution en général est la suivante:

 // I. the outer query ALIAS Employee emplyoee = null; // II. the subquery - using the alias var subQuery = QueryOver.Of() .Select(x => x.ID) .Where(x => x.Related.ID == emplyoee.ID); // use alias // III. declare the outer query and use the above alias var query = session.QueryOver(() => emplyoee) // declare alias .WithSubquery .WhereExists(subQuery); // put both together 

Vérifiez également ceci pour plus d’idées