2011-10-07 17 views
10

Tengo una tabla en C# y ASP.net que hace referencia a una lista de otra tabla donde se mapean varios vehículos matriculados en un solo vehículo. No deseo acceder a toda la colección de registratarios de vehículos accediendo a sus miembros individuales (por ejemplo, vehicleRegistrantsAlias[0]), porque no sé cuántos habrá.Declaración de unión para una lista

¿Debo hacer esto en dos consultas? Realmente me gustaría hacerlo todo en uno. Tengo la clase para padres como vehículo y una colección para niños de registrantes de vehículos. El solicitante de registro de vehículo es un tipo de base y bajo el registro de un vehículo es el propietario y el operador. También quiero extraer información de otras tablas secundarias. Me estoy uniendo de un vehículo a un vehículo. Registros que funcionan bien; sin embargo, también quiero sacar al dueño y al operador.

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) 
+0

¿Puedo aclarar esto? Estaría feliz de elaborar. – joncodo

+0

¿qué estás buscando o cómo se vería el sql que quieres tener? – Firo

+0

El sql obtendría toda la información de los niños de la colección de niños. Algo así como un bucle foreach dentro de una declaración de combinación. ¿Puedo unirme a la colección de niños y no solo a un solo niño? – joncodo

Respuesta

2

Puede utilizar LINQ to NHibernate, así, por lo general hace que las consultas más fácil de entender que la API QueryOver.

Sobre la base de los comentarios, supongo que se desee una función con la siguiente firma:

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(); 
} 

O, si usted tiene una relación en la dirección de VehicleRegistrant a su matriz Vehicle, esto también funcionaría

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

No estoy seguro de si esto es exactamente lo que quería, pero creo que se entiende. FetchMany(x => x.VehicleRegistrants) dice NHibernate también a ir a buscar toda la VehicleRegistrants para cada Vehicle en el conjunto de resultados y la siguiente ThenFetch(x => x.Owner) dice "y para cada uno de los VehicleRegistrants, también se ha podido recuperar su Owner".

¿Le sirve de ayuda?

0

cambiar las variables a:

VehicleRegistration vehicleRegistrationsAlias = null; 
    VehicleRegistrant vehicleRegistrantsAlias = null; 

Cambiar las líneas para JoinAlias:

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

y si la consulta recuperará tempranamente.

también llamada antes de lista:

.TransformUsing(Transformers.DistinctRootEntity) 
Cuestiones relacionadas