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