0

经过无数小时的尝试使 Entity Framework 与 Oracle 一起工作,我已经放弃并开始了 NHibernate 的道路。

我有点用术语挣扎,有一个问题。给定以下类,我如何使 NHibernate (Fluent Mappings) 输出类似于下面的 SQL,使用WriteOffApprovalUser.UserName作为字段的键Employee.MailID

C# 类

public class WriteOffApprovalUser : EntityBase<WriteOffApprovalUser>
{
    public virtual string UserName { get; set; }
    public virtual Employee.Employee Employee { get; set; }
}

public class Employee : EntityBase<Employee>
{
    public virtual string EmployeeID { get; set; }
    public virtual string EmployeeStatusCode { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string PreferredName { get; set; }
    public virtual string JobTitle { get; set; }
    public virtual string Division { get; set; }
    public virtual string Department { get; set; }
    public virtual string Location { get; set; }
    public virtual string City { get; set; }
    public virtual string DeskLocation { get; set; }
    public virtual string MailID { get; set; }
    public virtual string Phone { get; set; }
    public virtual string Fax { get; set; }
    public virtual string SecCode { get; set; }
    public virtual string SupervisorID { get; set; }
}

SQL

SELECT c.user_name,
        a.LAST_NAME
     || ', '
     || DECODE (a.PREFERRED_NAME, ' ', a.FIRST_NAME, a.preferred_name)
        writeoff_approval_name
FROM writeoff_approval_user c, adp_employee a
WHERE c.USER_NAME = a.USER_ID AND c.exp_date IS NULL
ORDER BY 2
4

1 回答 1

1

在 NHibernate 中,一切都是关于映射正确的方式。如果您使用的是 fluent,您应该在 WriteOffApprovalUser 中定义了对 Employee 实体的引用。就像在这个基本教程中一样

public class WriteOffApprovalUserMap : ClassMap<WriteOffApprovalUser> 
{
  public WriteOffApprovalUserMap()
  {
    Id(x => x.UserName);
    References(x => x.Employee);
  }
}

然后你需要做的就是一个简单的查询,比如

List<Employee> employees = session.Where(e => e.exp_date == null);

我还没有看到映射任何日期,但我很容易修复。

然后要拥有 DECODE 功能,我建议您做一些 DDD,而不是简单地为 Employee 做一个贫血的类,而是创建一个返回组合用户名的属性。

class Employee
{
    public string ComposedName
    {
        get {
            return this.LastName + string.IsNullOrEmpty(this.preferedName) ? 
            this.FirstName : this.PreferedName;
         }
     }
}

对我来说,这应该被视为一种计算,不需要在 SQL 查询中进行。作为奖励,此代码可以进行单元测试。

于 2013-03-30T23:06:35.620 回答