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) 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:
ChoosenBenefit
au ChoosenBenefit
du Contract
… pour obtenir le PersonId
Person
pure avec le résultat, et maintenant nous pouvons faire la pagination appropriée (Take (), Skip ()) sur l’entité Person