2014-02-12 2 views
0

У меня есть два класса (на самом деле больше из них):NHibernate - разбивка результата запроса по коллекции детской

public class City{ 
    public string Name; 
    public List<Street> Street; 
} 
public class Street{ 
    public string Name; 
    public City City; 
} 

Я пытаюсь извлечь отфильтрованные данные, используя ICriterion примерно так:

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

Как сформировать критерии, чтобы получить результат в виде списка City, содержащего дочернюю коллекцию Street, с одним элементом? Поэтому мне нужно, чтобы получить следующий результат:

City: 'London' -> Streets:{'Piccadilly'} 
City: 'London' -> Streets:{'Pickard'} 
City: 'London' -> Streets:{'Pickwick'} 

и т.д. , но в данный момент я получаю:

City: 'London' -> Streets:{'Piccadilly', 'Pickard', 'Pickwick'} 
City: 'London' -> Streets:{'Piccadilly', 'Pickard', 'Pickwick'} 
City: 'London' -> Streets:{'Piccadilly', 'Pickard', 'Pickwick'} 

Количество рядов = Количество найденных улиц. Мне нужно что-то вроде «ungrouping by Streets по всем строкам»

ответ

0

Я бы отговорил использовать Город как набор результатов, потому что это не будет действительными объектами города.

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]) } 
        }); 
Смежные вопросы