データベースからデータを取得してDTOを返す必要が非常にあります。私は、nHibernateを使用して複数のテーブルに参加し、DTOにかなりのコードであると言うように「投影する」ことを発見しました。いくつかの例を見て、私がnull値を持つDTOを残すことができなかったほとんどの場合、私は次のことを思いついて、nHibernateの忍者がそこにもっと良い方法があるかどうか教えてくれるのだろうかと思っていました。複数のテーブルを結合し、AliasToBeanを使用しているnHibernate Transformer
public IOpenIdUser GetOpenIdUser(string claimedIdentifier, IOpenIdUser openIdUserDto)
{
User user = null;
OpenIdUser openIdUser = null;
Profile profile = null;
UserType userType = null;
return
SessionWrapper.Session.QueryOver(() => user).JoinAlias(() => user.Profiles,() => profile).
JoinAlias(() => user.OpenIdUsers,() => openIdUser).JoinAlias(() => user.UserType,() => userType)
.Where(() => user.UserName == claimedIdentifier)
.SelectList(l => l
.Select(x => openIdUser.OpenIdUserId).WithAlias(() => openIdUser.OpenIdUserId)
.Select(x => user.UserId).WithAlias(() => openIdUserDto.UserId)
.Select(x => openIdUser.OpenIdClaimedIdentifier).WithAlias(
() => openIdUserDto.ClaimedIdentifier)
.Select(x => openIdUser.OpenIdFriendlyIdentifier).WithAlias(
() => openIdUserDto.FriendlyIdentifier)
.Select(x => openIdUser.OpenIdEndPoint).WithAlias(
() => openIdUserDto.OpenIdEndPoint)
.Select(x => user.UserName).WithAlias(() => openIdUserDto.UserName)
.Select(x => userType.Type).WithAlias(() => openIdUserDto.UserType)
.Select(x => profile.DisplayName).WithAlias(() => openIdUserDto.DisplayName)
.Select(x => profile.EmailAddress).WithAlias(() => openIdUserDto.EmailAddress)
.Select(x => openIdUser.DateCreated).WithAlias(() => openIdUserDto.DateCreated)
.Select(x => openIdUser.LastUpdated).WithAlias(() => openIdUserDto.LastUpdated)
.Select(x => openIdUser.UsageCount).WithAlias(() => openIdUserDto.UsageCount)
).TransformUsing(Transformers.AliasToBean<OpenIdUserDto>()).Future<OpenIdUserDto>().Single();
}
このメソッドは、私のUserRepositoryにあり、UserServiceによって呼び出されます。これは実際には動作しないでください、私はちょうどそのような簡単な作業のために残忍だと思う。また、私はこれを初めて覚えていることに注意してください。このコードが駄目なら事前にお詫び申し上げます。
これは誰かのために働いたと思います。私は投票を得た.. W00t! – CrazyCoderz