Interrogation avec ressortingction sur une classe différente de celle de la classe de retour

Pour mon projet actuel, j’apprends NHibernate et j’ai du mal à traduire la requête ci-dessous.

select person.Firstname, person.Lastname from Person inner join Contract on contract.PersonId = person.Id inner join Budget on budget.ContractId = contract.Id inner join Choice on choice.BudgetId = budget.Id inner join ChosenBenefit on ChosenBenefit.ChoiceId = choice.Id where ChosenBenefit.BenefitImplementationId = 77 

Je pensais que la solution ci-dessous ferait l’affaire, mais j’obtiens une référence null avec un stacktrace dont je ne peux pas me faire la tête ni la queue.

 Choice choice = null; Budget budget = null; Contract contract = null; Person person = null; var peopleThatChose = Session.QueryOver() .JoinAlias(chosenBenefit => chosenBenefit.Choice, () => choice) .JoinAlias(chosenBenefit => choice.Budget, () => budget) .JoinAlias(chosenBenefit => budget.Contract, () => contract) .JoinAlias(chosenBenefit => contract.Person, () => person) .Where(chosenBenefit => chosenBenefit.BenefitImplementation.Id == 77) .Select(benefit => person); 

D’après tous les exemples partout, il me QueryOver je suis censé QueryOver , mais je ne peux pas ensuite me rendre au point où je veux placer ma ressortingction.

Qu’est-ce que je rate?

En supposant certaines choses à propos de vos mappages, je suis sûr que vous pouvez le faire sans sous-requête:

 Person person = null; var peopleThatChose = Session.QueryOver(() => person) .JoinQueryOver(person => person.Contracts) .JoinQueryOver(contract => contract.Budget) .JoinQueryOver(budget => budget.Choice) .JoinQueryOver(choice => choice.ChosenBenefit) .Where(chosen => chosen.BenefitImplementation.Id == 77) .SelectList(list => list .Select(() => person.FirstName) .Select(() => person.LastName)) .List(); 

Si je lis correctement votre modèle: une Person pourrait avoir plus de contrats (contract.PersonId) . Nous allons donc dans ce cas diviser la requête en 2 parties.

  1. Sous-requête, pour obtenir le PerosnId d’un contrat (filtré par avantage) et
  2. La requête externe Personne récupérant uniquement des personnes …

1) la sous-requête

  var subquery = Session.QueryOver() // the path from Benefit to Contract is the same .JoinAlias(chosenBenefit => chosenBenefit.Choice, () => choice) .JoinAlias(chosenBenefit => choice.Budget, () => budget) .JoinAlias(chosenBenefit => budget.Contract, () => contract) // we do filter over choosen benefit, to get correct contracts .Where(chosenBenefit => chosenBenefit.BenefitImplementation.Id == 77) // lets select the PerosnId from a contract .Select(benefit => contract.PersonId); 

2) Nous allons maintenant interroger la personne et filtrer avec le résultat de la sous-requête (sur le serveur de firebase database)

 var peopleThatChose = session.QueryOver() .WithSubquery .WhereProperty(p => p.Id) .In(subquery); 

Alors, qu’avons-nous fait:

  • nous avons utilisé la navigation plusieurs-à-un à partir du ChoosenBenefit au ChoosenBenefit du Contract … pour obtenir le PersonId
  • nous avons filtré la requête de Person pure avec le résultat, et maintenant nous pouvons faire la pagination appropriée (Take (), Skip ()) sur l’entité Person