2012-02-10 23 views
6

我有一個非常基本的需求,從數據庫中獲取一些數據並返回一個DTO。我發現,使用nHibernate連接多個表並「投影」到DTO中需要相當多的代碼。看了幾個例子後,大多數沒有工作的東西給我留下了一個空值的DTO,我想到了下面的內容,並想知道nHibernate ninja是否可以告訴我是否有更好的方法。nHibernate加入多個表並使用AliasToBean變換器

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 2012-02-11 05:00:22

回答

2

如果您使用Queryover,那麼這是唯一的方法。

如果你真的認爲較少的代碼行是優選的,更直觀,或坐在更好地與你,那麼你可以做兩種: -

  1. 創建一個數據庫查看和創建壓縮映像文件與 mutable="false"視圖在您的班級定義和使用protected set;您的班級屬性
  2. 使用LINQ提供程序,而不是.Query(請參閱 此blog post欲瞭解更多信息)
+0

LINQ提供程序非常適用於非常基本的任務,但是我對LINQ提供程序生成的SQL並不感興趣。 – CrazyCoderz 2012-02-12 15:06:45

+0

接受這個答案是考慮到你沒有指出我發佈的代碼有任何可怕的問題,並且確實提供了另一種完成相同事情的方式。謝謝... – CrazyCoderz 2012-02-12 15:07:45

+0

我不會太在意LINQ提供程序生成的SQL,直到你發現它是一個問題,並且'NHPRof'實際上會告訴你,如果你有問題。 – Rippo 2012-02-12 15:34:18