Tengo una necesidad muy básica para obtener algunos datos de la base de datos y devolver un DTO. Encontré que unir varias tablas usando nHibernate y "proyectar", por decir algo, a un DTO era bastante código. Después de ver varios ejemplos, la mayoría de los cuales no funcionó, dejándome un DTO con valores nulos, me levanté con lo siguiente y me preguntaba si no ibas a anunciar que ninja podría decirme si hay una mejor manera.nHibernate uniendo múltiples tablas y usando AliasToBean 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();
}
Este método se encuentra en mi UserRepository y lo llama mi UserService. Por favor, no que esto realmente funcione, solo creo que es excesivo para una tarea tan simple. También tenga en cuenta que soy nuevo en esto, así que si este código es malo, me disculpo por adelantado.
Supongo que esto funcionó para alguien. Tengo un voto ... ¡W00t! – CrazyCoderz