nHibernate连接多个表并使用AliasToBean Transformer

nHibernate连接多个表并使用AliasToBean Transformer,nhibernate,Nhibernate,我需要从数据库中获取一些数据并返回DTO。我发现使用nHibernate连接多个表并将其“投影”到DTO需要相当多的代码。在看了几个例子之后,大多数都不起作用,给我留下了一个带有空值的DTO,我想到了下面的例子,我想知道是否有更好的方法 public IOpenIdUser GetOpenIdUser(string claimedIdentifier, IOpenIdUser openIdUserDto) { User user = null; OpenI

我需要从数据库中获取一些数据并返回DTO。我发现使用nHibernate连接多个表并将其“投影”到DTO需要相当多的代码。在看了几个例子之后,大多数都不起作用,给我留下了一个带有空值的DTO,我想到了下面的例子,我想知道是否有更好的方法

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();
    }
public IOpenIdUser GetOpenIdUser(字符串claimdidentifier,IOpenIdUser openIdUserDto)
{
User=null;
OpenIdUser OpenIdUser=null;
Profile=null;
UserType UserType=null;
返回
SessionWrapper.Session.QueryOver(()=>user).JoinAlias(()=>user.Profiles,()=>profile)。
JoinAlias(()=>user.OpenIdUsers,()=>openIdUser)。JoinAlias(()=>user.UserType,()=>UserType)
.Where(()=>user.UserName==claimdidentifier)
.选择列表(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).with别名(()=>openIdUserDto.LastUpdated)
.Select(x=>openIdUser.UsageCount).WithAlias(()=>openIdUserDto.UsageCount)
).TransformUsing(Transformers.AliasToBean()).Future().Single();
}

此方法位于我的UserRepository中,由我的UserService调用。请不要认为这真的有效,我只是认为这是一个简单的任务,它是过度杀伤力。另外请注意,我是新手,因此如果此代码很糟糕,我会提前道歉。

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

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

  • 创建数据库视图,并使用创建该视图的映射文件 在类定义中使用
    mutable=“false”
    ,并使用
    保护集在您的类属性上
  • 请改用LINQ提供程序,例如
    .Query
    (请参阅 (有关更多信息,请参阅此链接)

  • 我想这对某人有用。我投了一票。。W00t!LINQ提供程序非常适用于非常基本的任务,但是我对LINQ提供程序生成的SQL不太满意。考虑到您没有指出我发布的代码中存在任何可怕的问题,并且确实提供了实现相同任务的另一种方法,我接受这个答案。谢谢…我不会太在意linq提供程序生成的SQL,除非您发现它是一个问题,
    NHPRof
    会告诉您是否有问题。