nHibernate连接多个表并使用AliasToBean Transformer

时间:2012-02-10 15:05:14

标签: nhibernate

我非常需要从数据库中获取一些数据并返回DTO。我发现使用nHibernate加入多个表并且"投影"所以说,对DTO来说是相当多的代码。看了几个例子,大多数没有工作让我留下一个零值的DTO,我想到了以下内容并且想知道你是否有nHibernate ninja可以告诉我是否有更好的方法

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调用。请注意,这实际上是有效的,我认为这对于这么简单的任务来说太过分了。另请注意,我是新手,所以如果这段代码很糟糕,我会提前道歉。

1 个答案:

答案 0 :(得分:2)

如果您使用Queryover,那么这是唯一的方法。

如果你真的认为更少的代码行更可取,更直观,或者更适合你,那么你可以做到: -

  1. 创建数据库视图并为视图创建地图文件 您的班级定义中的mutable="false"并在您的班级属性
  2. 上使用protected set;
  3. 使用LINQ提供程序代替,例如.Query(见 这个blog post了解更多信息)