2013-10-08 32 views
1

很难找到如何解决我的问题,所以我张贴在这里。NHibernate QueryOver - 选择连接表的子节点的一个字段

public class A 
{ 
    public int IdA { get; set; } 
    public List<AB> ABs { get; set; } 
} 

public class AB 
{ 
    public A ObjectA { get; set; } 
    public B ObjectB { get; set; } 
} 

public class B 
{ 
    public int IdB { get; set; } 
    public string Name { get; set; } 
} 

我想找到QueryOver的方式,来获取这个列表DTO

public class DTO 
{ 
    public int IdA { get; set; } 
    public List<string> Names { get; set; } 
} 

正如你所看到的,我想有对象B的foreach对象的所有“名称”属性B在我的AB房产中找到。

如果你知道该怎么做,你能帮我吗?

回答

2

有几个方法可以做到这一点,但没有我在知道的只是 QueryOver。您可以将QueryOver查询视为几乎直接转换为SQL。如果你这样想,就不可能在一个步骤中填充List属性(你不能编写一个导致ID和项目“列表”的SQL查询,至少不使用某种聚合) 。

考虑到这一点,我认为最好在这里定义一种新型的中间DTO。

public class FlattenedDTO 
{ 
    public int IdA { get; set; } 
    public string Name { get; set; } 
} 

然后你会写你的查询,预测到FlattenedDTO。我们选取了后的FlattenedDTO S,我们可以将它们分组列表进入DTO个新的列表:

B bAlias = null; 
FlattenedDTO result = null; 

session.QueryOver<A>() 
    .JoinQueryOver<AB>(a => a.ABs) 
    .JoinQueryOver(ab => ab.B,() => bAlias) 
    .SelectList(list => list 
     .Select(a => a.Id).WithAlias(() => result.IdA) 
     .Select(() => bAlias.Name).WithAlias(() => result.Name)) 
    .TransformUsing(Transformers.AliasToBean<FlattenedDTO>()) 
    .List<FlattenedDTO>() 
    // At this point the query has been run and we just need to group the results 
    .GroupBy(dto => dto.IdA, dto => dto.Name) 
    .Select(grp => new DTO { IdA = grp.Key, Names = grp.ToList() }); 

这最终会发出一个查询:

SELECT this_.IdA  as y0_, 
     balias2_.Name as y1_ 
FROM [A] this_ 
     inner join [AB] ab1_ 
     on this_.Id = ab1_.IdA 
     inner join [B] balias2_ 
     on ab1_.IdB = balias2_.Id 

和分组在内存中的结果。还有其他一些方法可以做到这一点,所以让我知道如果这不符合您的需求。

+0

非常感谢!它运作良好。我误解了QueryOver的一些原则... – Toben

1

你必须创建一个表& NHibernate的映射,在那里编写一个查询用的hbm.xml映射像

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NSP.DataModel" namespace="NSP.DataModel.A"> 
    <class name="A" entity-name="SysA" table="A"> 
    <id name="IdA" column="id" type="Int32"> 
     <generator class="identity"/> 
    </id> 

    <bag name="DTO" inverse="true"> 
     <key column="IdA"/> 
     <one-to-many entity-name="Names"/> 
    </bag> 

    </class> 
</hibernate-mapping> 
+0

对不起,我没有说我正在使用FluentNHibernate ... – Toben

相关问题