2012-02-10 11 views
6

データベースからデータを取得して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によって呼び出されます。これは実際には動作しないでください、私はちょうどそのような簡単な作業のために残忍だと思う。また、私はこれを初めて覚えていることに注意してください。このコードが駄目なら事前にお詫び申し上げます。

+0

これは誰かのために働いたと思います。私は投票を得た.. W00t! – CrazyCoderz

答えて

2

[クエリオーバー]を使用する場合は、これが唯一の方法です。

あなたが本当にコードの以下の行は、より直感的に好ましい、またはあなたとのより良い座っている、あなたはどちらかを行うことができると思う場合: -

  1. DBのビューを作成し、 mutable="false"とビューのためのmapingsファイルを作成しますクラス定義でprotected set;を使用してください。
  2. 代わりにLINQプロバイダを使用してください.Query(詳細は を参照してください。blog post
+0

LINQプロバイダーは非常に基本的な作業には最適ですが、LINQプロバイダーによって生成されたSQLには本当に感心していません。 – CrazyCoderz

+0

私が掲示したコードで何かひどい問題を指摘せず、実際に同じことを達成するための別の方法を提供したと考えると、これを答えとして受け入れます。ありがとう... – CrazyCoderz

+0

linqプロバイダが問題になることがわかり、問題がある場合には 'NHPRof'が実際にあなたに通知するまで、私はlinqプロバイダが生成するSQLにあまり関心がありません。 – Rippo

関連する問題