gpt4 book ai didi

c# - NHibernate 连接和投影属性

转载 作者:行者123 更新时间:2023-11-30 19:07:55 25 4
gpt4 key购买 nike

我有简单的情况(如图像 link text )和简单的 SQL 查询

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. 将数据检索到我的网格控件
    - 名字,
    - 姓氏,
    - 国家知识产权局,
    - 位置.描述,
    -教育.描述,
    - JobType.Description,
    - Country.Description - 来自 Address.Official 为真的地址,
    - 街道 - 来自 Address.Official 为真的地址,
    - HouseNo - 来自地址,其中 Address.Official 为真,
    - FlatNo - 来自地址,其中 Address.Official 为真。
  1. 将数据检索到另一个网格控件
    - 名字,
    - 姓氏,
    - 国家知识产权局,
    - 位置.描述,
    -教育.描述,
    - JobType.Description.

还有最重要的思考。我只想使用一个 SELECT 语句来完成此操作。现在对于第 1 点,我使用 NamedSQLQuery,一切正常,但对于最简单的情况,我想使用 CriteriaAPI。

同样对于第 1 点和第 2 点,我有 DTO 类并将查询结果转换为此类。

我可以通过 GetAllEmployees() 来做到这一点,但许多属性是延迟加载的,这样做我在应用程序和数据库之间有一个巨大的流量。我可以将这些属性更改为 Eager Loading,但在我看来,有太多数据需要检索,而我不需要。

最佳答案

我找到了我的解决方案:)

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

关于c# - NHibernate 连接和投影属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2917490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com