1

很难找到如何解决我的问题,所以我在这里发布。

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

如您所见,我希望在我的 ABs 属性中找到对象 B 的所有“名称”属性。

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

4

2 回答 2

2

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

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

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

然后你会写你的查询,投影到FlattenedDTO. 在我们选择了一个FlattenedDTOs 列表之后,我们可以将它们分组到一个新的DTOs 列表中:

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

并将结果分组到内存中。还有其他几种方法可以做到这一点,所以如果这不符合您的需求,请告诉我。

于 2013-10-08T12:59:56.767 回答
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>
于 2013-10-08T11:59:06.783 回答