nHibernate: dividir el resultado de la consulta por colección secundaria
Frecuentes
Visto 190 equipos
0
Tengo dos clases (en realidad, más):
public class City{
public string Name;
public List<Street> Street;
}
public class Street{
public string Name;
public City City;
}
Estoy tratando de recuperar datos filtrados usando ICriterion aproximadamente así:
ICriteria crit = CurrentSession
.CreateCriteria(typeof (City));
crit = crit.CreateAlias("Streets", "Street", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
crit.Add(Expression.InsensitiveLike("Name", "London", MatchMode.Exact));
crit.Add(Expression.InsensitiveLike("Street.Name", "Pic%", MatchMode.Exact));
¿Cómo debo formar los criterios para obtener el resultado como la lista de Ciudad que contiene la colección secundaria de Calle con exactamente un elemento? Entonces necesito obtener el siguiente resultado:
City: 'London' -> Streets:{'Piccadilly'}
City: 'London' -> Streets:{'Pickard'}
City: 'London' -> Streets:{'Pickwick'}
etc. pero en este momento estoy recibiendo:
City: 'London' -> Streets:{'Piccadilly', 'Pickard', 'Pickwick'}
City: 'London' -> Streets:{'Piccadilly', 'Pickard', 'Pickwick'}
City: 'London' -> Streets:{'Piccadilly', 'Pickard', 'Pickwick'}
Número de filas = Número de calles encontradas. Necesito algo como 'desagrupar por calles en todas las filas'
1 Respuestas
0
Desaconsejaría el uso de City como conjunto de resultados porque no será un objeto de ciudad válido.
ICriteria crit = CurrentSession.CreateCriteria(typeof(City))
.CreateAlias("Streets", "Street", JoinType.InnerJoin)
.Add(Expression.InsensitiveLike("Name", "London", MatchMode.Exact))
.Add(Expression.InsensitiveLike("Street.Name", "Pic%", MatchMode.Exact))
.SetProjection(Projections.List()
.Add(Projections.Property("Name"))
.Add(Projections.Property("Street.Name")));
var results1 = crit.List<object[]>()
.Select(arr => new LocationDto
{
CityName = (string)arr[0],
StreetName = (string)arr[1]
});
// or if it is really needed
var results2 = crit.List<object[]>()
.Select(arr => new City
{
Name = (string)arr[0],
Streets = { new Street((string)arr[1]) }
});
Respondido 13 Feb 14, 09:02
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# nhibernate collections or haz tu propia pregunta.