Ho una necessità molto basilare di ottenere alcuni dati dal database e restituire un DTO. Ho scoperto che unire più tabelle utilizzando nHibernate e "projecting", per così dire, a un DTO è un bel po 'di codice. Dopo aver esaminato diversi esempi, la maggior parte dei quali non ha funzionato lasciandomi un DTO con valori nulli, mi sono avvicinato a quanto segue e mi stavo chiedendo se non sei in grado di vedere se c'è un modo migliore.nHibernate che unisce più tabelle e utilizza 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();
}
Questo metodo si trova nel mio UserRepository e viene chiamato dal mio UserService. Per favore, non che funzioni davvero, penso solo che sia eccessivo per un compito così semplice. Inoltre, ti prego di notare che sono nuovo in questo modo, quindi se questo codice è pessimo mi scuso in anticipo.
Suppongo che questo ha lavorato per qualcuno. Ho ottenuto un voto .. W00t! – CrazyCoderz