私は2つのクラスを持っています(問題を再現するだけです):
public class User
{
public virtual int Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual IList<OrgUnitMembership> OrgUnitMemberships { get; set; }
}
public class OrgUnitMembership
{
public virtual int UserId { get; set; }
public virtual int OrgUnitId { get; set; }
public virtual DateTime JoinDate { get; set; }
public virtual DateTime LeaveDate { get; set; }
}
もちろん、両方の Fluent NHibernate マップがあります。
public class UserMapping : ClassMap<User>
{
public UserMapping()
{
Table("Users");
Id(e => e.Id).GeneratedBy.Identity();
Map(e => e.FirstName);
Map(e => e.LastName);
HasMany(x => x.OrgUnitMemberships)
.KeyColumn(TypeReflector<OrgUnitMembership>
.GetPropertyName(p => p.UserId))).ReadOnly().Inverse();
}
}
public class OrgUnitMembershipMapping : ClassMap<OrgUnitMembership>
{
public OrgUnitMembershipMapping()
{
Table("OrgUnitMembership");
CompositeId()
.KeyProperty(x=>x.UserId)
.KeyProperty(x=>x.OrgUnitId);
Map(x => x.JoinDate);
Map(x => x.LeaveDate);
References(oum => oum.OrgUnit)
.Column(TypeReflector<OrgUnitMembership>
.GetPropertyName(oum => oum.OrgUnitId)).ReadOnly();
References(oum => oum.User)
.Column(TypeReflector<OrgUnitMembership>
.GetPropertyName(oum => oum.UserId)).ReadOnly();
}
}
私がやりたいことは、基準に基づいて一部のユーザーを取得することですが、Users テーブルのすべての列を OrgUnitMemberships テーブルのいくつかの列と組み合わせて、SQL クエリに類似させたいと考えています。
select u.*, m.JoinDate, m.LeaveDate
from Users u inner join OrgUnitMemberships m on u.Id = m.UserId
where m.OrgUnitId = :ouid
私は完全に迷っています。さまざまなオプションを試しました。単純な SQL クエリを使用するとほとんど機能しますが、User クラス AliasToBean に null 許容列挙型がいくつかあるため、変換に失敗します。それ以外の場合、SQL クエリをラップすると次のようになります。
return
Session
.CreateSQLQuery(sql)
.SetParameter("ouid", orgUnitId)
.SetResultTransformer(Transformers.AliasToBean<UserDTO>())
.List<UserDTO>()
以下のコードをテスト (いくつかの異なるバリエーション) として試しましたが、何をしているのかわかりません。部分的に機能し、UserDTO のインスタンスを取得し、OrgUnitMembership (日付) からのプロパティが入力されますが、User のすべてのプロパティは null です。
User user = null;
OrgUnitMembership membership = null;
UserDTO dto = null;
var users = Session.QueryOver(() => user)
.SelectList(list => list
.Select(() => user.Id)
.Select(() => user.FirstName)
.Select(() => user.LastName))
.JoinAlias(u => u.OrgUnitMemberships, () => membership)
//.JoinQueryOver<OrgUnitMembership>(u => u.OrgUnitMemberships)
.SelectList(list => list
.Select(() => membership.JoinDate).WithAlias(() => dto.JoinDate)
.Select(() => membership.LeaveDate).WithAlias(() => dto.LeaveDate))
.TransformUsing(Transformers.AliasToBean<UserDTO>())
.List<UserDTO>();