c# - NHibernate - 检索特定列并使用条件查询进行计数

标签 c# nhibernate joined-subclass

这是我的映射文件:

class name="CRMStradCommon.Entities.OportunidadEntity,CRMStradCommon" table="oportunidad">

    <id name="Id" column="id" type="int">
        <generator class="native" />
    </id>
    <property name="Titulo" column="titulo" type="string" not-null="true" />
    <many-to-one name="Estado" column="estado" class="CRMStradCommon.Entities.EstadoOportunidadEntity,CRMStradCommon"  />
    <many-to-one name="Dueno" column="dueno" class="CRMStradCommon.Entities.ContactoEntity,CRMStradCommon"  />
    <property name="FechaCierreEstimado" column="fecha_cierre_estimado" type="DateTime" not-null="false"/>
    <property name="FechaVencimiento" column="fecha_vencimiento" type="DateTime" not-null="false"/>
</class>

这是另一个有joined-subclass的

class name="CRMStradCommon.Entities.ContactoEntity,CRMStradCommon" table="contacto"  dynamic-update="true">
    <id name="Id" column="id" type="int">
        <generator class="native" />
    </id>
    <property name="Nombre" column="nombre" type="string" not-null="true" />
    <property name="Email1" column="email1" type="string" />
    <property name="Email2" column="email2" type="string" />
    <property name="Web1" column="web1" type="string" />
    <property name="Web2" column="web2" type="string" />
    <bag name="DuenoOportunidadList" lazy="true" inverse="true">
        <key column="dueno"/>
        <one-to-many class="CRMStradCommon.Entities.OportunidadEntity,CRMStradCommon"/>
    </bag>
    <joined-subclass name="CRMStradCommon.Entities.EmpresaEntity,CRMStradCommon" table="empresa" lazy="false">
        <key column="id" />
        <many-to-one name="Categoria" column="categoria" class="CRMStradCommon.Entities.CategoriaEmpresaEntity,CRMStradCommon"  />
        <many-to-one name="Calificacion" column="calificacion" class="CRMStradCommon.Entities.CalificacionEmpresaEntity,CRMStradCommon"  />
    </joined-subclass>
    <joined-subclass  name="CRMStradCommon.Entities.PersonaEntity,CRMStradCommon" table="persona" lazy="false">
        <key column="id" />
        <property name="Saludo" column="saludo" type="string" />
        <property name="Apellido" column="apellido" type="string" />
        <property name="SegundoNombre" column="segundo_nombre" type="string" />
    </joined-subclass>
</class>

如何使用条件进行查询?

SELECT     
    contacto.id, contacto.nombre, persona.apellido, COUNT(*) AS Cant
FROM         
    contacto 
INNER JOIN
    oportunidad ON contacto.id = oportunidad.dueno 
LEFT OUTER JOIN
    persona ON contacto.id = persona.id 
LEFT OUTER JOIN
    empresa ON contacto.id = empresa.id
GROUP BY 
    contacto.id, contacto.nombre, persona.apellido
ORDER BY 
    contacto.nombre, persona.apellido

非常感谢!

非常感谢!它解决了我的部分问题。我这样做了:

ICriteria criteria = session.CreateCriteria(typeof(ContactoEntity));
criteria.SetProjection(Projections.ProjectionList()
                    .Add(Projections.GroupProperty("Id"),"Id")
                    .Add(Projections.GroupProperty("Nombre"),"Nombre")
                    .Add(Projections.GroupProperty("Apellido"), "Apellido")
                    .Add(Projections.GroupProperty("TipoContacto"), "TipoContacto")
                    .Add(Projections.RowCount(),"CantOportunidadesDueno"));
criteria.CreateCriteria("DuenoOportunidadList");
criteria.AddOrder(Order.Asc("Nombre")).AddOrder(Order.Asc("Apellido"));
criteria.SetResultTransformer(
                    new NHibernate.Transform.AliasToBeanResultTransformer(typeof(ContactoEntity)));

IList<ContactoEntity> ContLst = (criteria.List<ContactoEntity>());

我使用 Transformer 来收集 Contacto 实体,但问题出在属性 Apellido 上。我在子类 Persona 中有它,并且该集合仅由父类而不是子类组成。

你知道是否有可能解决这个问题吗?或者我唯一的解决方案是在不使用转换器的情况下抛出每个集合项并创建一个新的 Contacto 实体集合来创建每个新对象?

谢谢!!!

最佳答案

您想使用投影。像这样:

session.createCriteria(ContactoEntity.class)
  .setProjection(Projections.projectionList()
    .add(Projections.groupProperty("id")
    .add(Projections.groupProperty("nombre")
    .add(Projections.groupProperty("apellido")
    .add(Projections.rowCount()));

更新 - 我刚刚注意到您正在使用 NHibernate,而且我是 Java 用户,所以我提供的代码片段可能需要调整以供您使用。希望对您有所帮助。

关于c# - NHibernate - 检索特定列并使用条件查询进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493443/

相关文章:

c# - 为什么对于那些喜欢类型安全的人来说 Null 不是类型安全的无关紧要

c# - 如何使用 Roslyn 加载现有程序集、对其进行转换并生成新的 .cs 文件

NHibernate:在映射中指定的复合键之外加入集合

NHibernate更新引用

java - 使用注释时加入子类的未知实体问题

c# - 值是枚举和 -1 吗?

c# - 如何在数据 GridView 特定列上设置默认文本值

c# - NHibernate 哪个缓存用于 WinForms 应用程序

c# - 子类上的 NHibernate (3.1) 子查询未加入基类表

java - Hibernate 在使用注释时无法创建连接子类表