2010-05-26 86 views
2

我有简单的情况下(如图像link text上)和简单的SQL查询NHibernate的加入和投影性能

SELECT M.Name, 
      A.Name, 
      B.Name 
FROM Master M  LEFT JOIN DetailA A 
ON M.DescA = A.Id LEFT JOIN DetailB B 
ON M.DescB = B.Id 

如何才达到NHibernate的使用CriteriaAPI同样的效果?

我有这样的事情:

public class Employee : ClassBase, IContactData 
{ 
    public virtual string FirstName { get; set; } 
    public virtual string MiddleName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string NickName { get; set; } 
    public virtual string Login { get; set; } 
    public virtual string Password { get; set; } 
    public virtual string ContactPerson { get; set; } 
    public virtual string PESEL { get; set; } 
    public virtual string IdentificationNo { get; set; } 
    public virtual string NIP { get; set; } 
    public virtual string Description { get; set; } 
    public virtual string Profession { get; set; } 
    public virtual byte[] Photo { get; set; } 
    public virtual DateTime? BirthDate { get; set; } 
    public virtual Boolean SpecialUser { get; set; } 
    public virtual Boolean Sex { get; set; } 
    public virtual Item Gender { get; set; } 
    public virtual Item Position { get; set; } 
    public virtual Item Status { get; set; } 
    public virtual Item Nation { get; set; } 
    public virtual Item Education { get; set; } 
    public virtual Item JobType { get; set; } 
    public virtual ISet<Address> Addresses { get; set; } 
} 

public class Item : ClassBase 
{ 

    public virtual int ItemCode { get; set; } 
    public virtual int DictCode{ get; set;} 
    public virtual string Description{ get; set;} 

    public override string ToString() 
    { 
     return Description; 
    } 
} 

public class Address : ClassBase 
{ 
    public virtual string Description { get; set; } 
    public virtual string District { get; set; } 
    public virtual string Community { get; set; } 
    public virtual string City { get; set; } 
    public virtual string Street { get; set; } 
    public virtual string PostalCode { get; set; } 
    public virtual string HouseNo { get; set; } 
    public virtual string FlatNo { get; set; } 
    public virtual Boolean Official { get; set; } 
    public virtual Item Country { get; set; } 
    public virtual Item Region { get; set; } 
} 

映射:

<property name="FirstName"  column="FIRST_NAME"   type="string" length="50" not-null="true"/> 
<property name="MiddleName"  column="MIDDLE_NAME"  type="string" length="50" not-null="false"/> 
<property name="LastName"   column="LAST_NAME"   type="string" length="50" not-null="true"/> 
<property name="NickName"   column="NICKNAME"   type="string" length="50" not-null="false"/> 
<property name="Login"   column="LOGIN"    type="string" length="30" not-null="false"/> 
<property name="Password"   column="PASSWORD"   type="string" length="100" not-null="false"/> 
<property name="ContactPerson" column="CONTACT_PERSON"  type="string" length="250" not-null="false"/> 
<property name="PESEL"   column="PESEL"    type="string" length="11" not-null="false"/> 
<property name="IdentificationNo" column="IDENTIFICATION_NO" type="string" length="12" not-null="false"/> 
<property name="NIP"    column="NIP"    type="string" length="11" not-null="false"/> 
<property name="Description"  column="DESCRIPTION"  type="string" length="1000" not-null="false"/> 
<property name="Profession"  column="PROFESSION"   type="string" length="150" not-null="false"/> 
<property name="BirthDate"  column="BIRTH_DATE"   type="DateTime"    not-null="false"/> 
<property name="Photo"   column="PHOTO"    type="BinaryBlob"    not-null="false"/> 
<property name="Sex"    column="SEX"    type="Boolean"     not-null="false"/> 
<property name="SpecialUser"  column="SPECIAL_USER"  type="Boolean"     not-null="false"/> 

<many-to-one name="Gender"  column="DIC_GENDER"   not-null="false" class="DomainModel.ERP.Item,DomainModel" /> 
<many-to-one name="Position"  column="DIC_POSITION"  not-null="false" class="DomainModel.ERP.Item,DomainModel" /> 
<many-to-one name="Status"  column="DIC_STATUS"   not-null="false" class="DomainModel.ERP.Item,DomainModel" /> 
<many-to-one name="Nation"  column="DIC_NATION"   not-null="false" class="DomainModel.ERP.Item,DomainModel" /> 
<many-to-one name="Education"  column="DIC_EDUCATION"  not-null="false" class="DomainModel.ERP.Item,DomainModel" /> 
<many-to-one name="JobType"  column="DIC_JOB_TYPE"  not-null="false" class="DomainModel.ERP.Item,DomainModel" /> 

<set name="Addresses" table="TBL_ADDRESS" generic="true"> 
    <key column="FK_EMPLOYEE" /> 
    <one-to-many class="DomainModel.ERP.HRM.Address,DomainModel"/> 
</set> 

<property name="ItemCode"   column="ITEM_CODE"   type="integer" not-null="true"/> 
<property name="DictCode"   column="TABLE_CODE"   type="integer" not-null="true"/> 
<property name="Description"  column="NAME"    type="string" length="200" not-null="true"/> 

<version name="Version"  column="VERSION"  type="integer" unsaved-value="0"/> 
<property name="Description" column="DESCRIPTION" type="string" length="1000" not-null="false"/> 
<property name="District"  column="DISTRICT"  type="string" length="15" not-null="false"/> 
<property name="Community" column="COMMUNITY"  type="string" length="150" not-null="false"/> 
<property name="City"   column="CITY"   type="string" length="150" not-null="true"/> 
<property name="Street"  column="STREET"  type="string" length="150" not-null="true"/> 
<property name="PostalCode" column="POSTAL_CODE" type="string" length="10" not-null="false"/> 
<property name="HouseNo"  column="HOUSENO"  type="string" length="20" not-null="true"/> 
<property name="FlatNo"  column="FLATNO"  type="string" length="20" not-null="false"/> 
<property name="Official"  column="IS_OFFICIAL" type="Boolean"     not-null="true"/> 

<many-to-one name="Country"   column="DIC_COUNTRY"  not-null="false" class="DomainModel.ERP.Item,DomainModel" /> 
<many-to-one name="Region"   column="DIC_REGION"  not-null="false" class="DomainModel.ERP.Item,DomainModel" /> 

我需要:

  1. Retrive数据到我的网格控制
    - 姓,
    - 姓氏,
    - NIP,
    - 位置。说明,
    - Education.Description,
    - JobType.Description,
    - Country.Description - 从地址,其中Address.Official是真实的,
    - 街 - 从地址,其中Address.Official是真的,
    - 的HouseNo - 从地址,其中Address.Official是真实的,
    - FlatNo - 从地址,其中Address.O真实的。
  • Retrive数据到另一个网格控制
    • - 姓,
      - 名字,
      - NIP,
      - Position.Description ,
      - Education.Description,
      - JobType.Description。

    和最重要的想法。我只想使用一个SELECT语句来完成此操作。 现在为第1点我使用NamedSQLQuery和一切正在工作的炉排,但对于最简单的情况我想使用CriteriaAPI。

    也用于点1和2 I具有DTO类和我变换查询的结果到这个类。

    我能做到这一点通过GetAllEmployees(),但许多属性是延迟加载,做我有应用程序和数据库之间的巨大TRAFIC。我可以将这些属性更改为Eager Loading,但在我看来,有太多的数据需要修改,我不需要。要显示与来自多个实体的数据网格,只需创建一个SQL视图和地图与NH -

    +1

    您将需要包括你的映射一些细节给予任何形式的回答 – 2010-05-26 23:15:24

    +0

    的你真的* *想要得到唯一的名字?通常当使用ORM时,你会得到整个对象。 – 2010-05-27 04:51:57

    回答

    5

    我对这种情况的意见。

    你会从长远来看,更快乐。

    +0

    可以轻松处理分页场景吗? – kite 2012-08-14 20:07:01

    +0

    当然。这与常规表格上的分页相同。 – sirrocco 2012-08-16 07:01:25

    7

    我发现我的解决方案:)

    var master = DetachedCriteria.For<Master>() 
         .CreateAlias("DetailA", "detA", JoinType.LeftOuterJoin) 
         .CreateAlias("DetailB", "detB", JoinType.LeftOuterJoin) 
         .SetProjection 
         (
          Projections.ProjectionList() 
          .Add(Projections.Property("Id"), "Id") 
          .Add(Projections.Property("Name"), "MasterName") 
          .Add(Projections.Property("detA.Name"), "DetailAName") 
          .Add(Projections.Property("detB.Name"), "DetailBName") 
         ) 
         .SetResultTransformer(Transformers.AliasToBean(typeof (MasterDTO))); 
    
    class MasterDTO 
    { 
        public virtual int Id {get;set;} 
        public virtual string MasterName {get;set;} 
        public virtual string DetailAName {get;set;} 
        public virtual string DetailBName {get;set;} 
    
        public MasterDTO() 
        {} 
    
        public MasterDTO(int id, string mastername, string detailaname, string detailbname) 
        { 
         Id = id; 
         MasterName = mastername; 
         DetailAName = detailaname; 
         DetailBName = detailbname; 
        } 
    }