2014-02-12 61 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: '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'} 

行数=发现街道的数量。我需要像'跨所有行的街道取消组合'

回答

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