【问题标题】:NHibernate QueryOver - Select one field of sub childrens of join tablesNHibernate QueryOver - 选择连接表的子子项的一个字段
【发布时间】:2013-10-08 11:26:07
【问题描述】:

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

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 的所有“名称”属性。

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

【问题讨论】:

    标签: c# nhibernate join queryover


    【解决方案1】:

    有几种方法可以做到这一点,但我在只是 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
    

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

    【讨论】:

      【解决方案2】:

      您必须使用表创建 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        相关资源
        最近更新 更多