10 votes

Déclaration de jonction pour une liste

J'ai une table en C# et ASP.net qui fait référence à une liste d'une autre table où plusieurs titulaires de véhicules sont associés à un seul véhicule. Je ne souhaite pas parcourir l'ensemble de la collection de détenteurs de véhicules en accédant à leurs membres individuels (par ex. vehicleRegistrantsAlias[0] ), car je ne sais pas combien il y en aura.

Dois-je le faire en deux fois ? J'aimerais vraiment le faire en une seule fois. J'ai la classe parentale véhicule et une collection enfant des immatriculations de véhicules. Le titulaire du véhicule est un type de base et le propriétaire et l'opérateur se trouvent sous le titulaire du véhicule. Je souhaite également extraire des informations d'autres tables enfant. Je joins la table vehicle à la table vehicleRegistrants, ce qui fonctionne bien, mais je veux aussi extraire les informations relatives au propriétaire et à l'exploitant.

Vehicle vehicleAlias = null;
List<VehicleRegistration> vehicleRegistrationsAlias = null; 
List<VehicleRegistrant> vehicleRegistrantsAlias = null; 

.JoinAlias(() => vehicleAlias.VehicleRegistrations, () => vehicleRegistrationsAlias)
.JoinAlias(() => vehicleAlias.VehicleRegistrants, () => vehicleRegistrantsAlias)

//from vehicle registrants
.JoinAlias(() => vehicleRegistrantsAlias[0]., () => vehicleSuspensionTypeAlias)

2voto

twoflower Points 2968

Vous pouvez également utiliser LINQ to NHibernate, qui rend généralement les requêtes plus faciles à comprendre que l'API QueryOver.

D'après les commentaires, je suppose que vous voulez une fonction avec la signature suivante :

public Vehicle GetVehicle(VehicleRegistrant registrant)
{
    var vehicle = session.Query<Vehicle>()
                         .FetchMany(x => x.VehicleRegistrants)
                         .ThenFetch(x => x.Owner)
                         .Where(x => x.VehicleRegistrants.Contains(registrant))
                         .SingleOrDefault();
}

Ou, si vous avez une relation dans la direction de VehicleRegistrant à son parent Vehicle Cette méthode fonctionnerait également.

public Vehicle GetVehicle(VehicleRegistrant registrant)
{
    var vehicle = session.Query<Vehicle>()
                         .FetchMany(x => x.VehicleRegistrants)
                         .ThenFetch(x => x.Owner)
                         .Where(x => x == registrant.Vehicle)
                         .SingleOrDefault();
}

Je ne sais pas si c'est exactement ce que vous vouliez, mais je pense que vous avez compris l'idée. FetchMany(x => x.VehicleRegistrants) indique à NHibernate de récupérer également tous les fichiers VehicleRegistrants pour chaque Vehicle dans l'ensemble des résultats et ce qui suit ThenFetch(x => x.Owner) dit "et pour chacun de ces VehicleRegistrants , et de récupérer son Owner ".

Cela vous aide-t-il ?

0voto

joe Points 21

Modifier les variables en :

    VehicleRegistration vehicleRegistrationsAlias = null; 
    VehicleRegistrant vehicleRegistrantsAlias = null; 

Modifiez les lignes JoinAlias en :

.JoinAlias(() => vehicleAlias.VehicleRegistrations, () => vehicleRegistrationsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.JoinAlias(() => vehicleAlias.VehicleRegistrants, () => vehicleRegistrantsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)

Et la requête va chercher avec empressement.

Appelez aussi avant la liste :

.TransformUsing(Transformers.DistinctRootEntity)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X