0

Entity Framework を Oracle で動作させるために数え切れないほどの時間を費やした後、私はあきらめて NHibernate の道を歩み始めました。

専門用語に少し苦労していて、質問があります。次のクラスが与えられた場合、フィールドWriteOffApprovalUser.UserNameのキーとしてを使用して、NHibernate (Fluent Mappings) に以下の SQL に似たものを出力させるにはどうすればよいですか。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

Hibernate では、正しい方法でマッピングすることがすべてです。流暢を使用している場合は、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 に答える