nHibernate: dividir el resultado de la consulta por colección secundaria

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'

preguntado el 12 de febrero de 14 a las 07:02

1 Respuestas

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 or haz tu propia pregunta.