0

私は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>();
4

1 に答える 1

1

2 つの SelectList メソッドを結合するだけです。エイリアスにより、NHibernate が適切なエンティティから適切なプロパティを取得できるようになります。

User user = null;
OrgUnitMembership membership = null;
UserDTO dto = null;
var users = Session.QueryOver(() => user)
    .JoinAlias(u => u.OrgUnitMemberships, () => membership)
    //.JoinQueryOver<OrgUnitMembership>(u => u.OrgUnitMemberships)
    .SelectList(list => list
        .Select(() => user.Id)
        .Select(() => user.FirstName)
        .Select(() => user.LastName))
        .Select(() => membership.JoinDate).WithAlias(() => dto.JoinDate)
        .Select(() => membership.LeaveDate).WithAlias(() => dto.LeaveDate))
    .TransformUsing(Transformers.AliasToBean<UserDTO>())
    .List<UserDTO>();
于 2012-10-12T15:59:20.093 に答える