在尝试让Entity Framework与Oracle协同工作数小时之后,我已经放弃并开始了NHibernate的路径。
我正在努力学习语言,并有一个问题。鉴于以下类,如何使用WriteOffApprovalUser.UserName
作为Employee.MailID
字段的键,使NHibernate(Fluent Mappings)输出类似于下面的SQL的内容。
C#Classes
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
答案 0 :(得分:1)
在NHibernate中,一切都是关于正确的映射方式。如果您使用的是流畅的,则应该在WriteOffApprovalUser中为Employee实体定义一个引用。 Like in this basic tutorial
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创建一个anemic class来创建一个返回组合用户名的属性。
class Employee
{
public string ComposedName
{
get {
return this.LastName + string.IsNullOrEmpty(this.preferedName) ?
this.FirstName : this.PreferedName;
}
}
}
对我来说,应该将其视为计算,而不需要在SQL查询中执行此操作。作为奖励,此代码可以进行单元测试。