2012-02-10 12 views
6

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.

+0

Suppongo che questo ha lavorato per qualcuno. Ho ottenuto un voto .. W00t! – CrazyCoderz

risposta

2

Se si utilizza Queryover, questo è l'unico modo.

Se davvero pensare di meno linee di codice sono preferibili, più intuitivo, o si siede meglio con voi allora si può fare sia: -

  1. creare una vista DB e creare mapings file per la vista con mutable="false" nella definizione della classe e utilizzare protected set; sulle proprietà della classe
  2. Utilizzare il provider LINQ, ad esempio .Query (vedi questo blog post per maggiori informazioni)
+0

Il provider LINQ è ottimo per attività di base, tuttavia non sono molto impressionato dall'SQL generato dal provider LINQ. – CrazyCoderz

+0

Accettare questo come risposta, considerando che non hai evidenziato problemi terribili con il codice che ho postato e in realtà fornisci un altro modo per realizzare la stessa cosa. Grazie ... – CrazyCoderz

+0

Non sarei troppo interessato all'SQL che il provider linq genera finché non si scopre che si tratta di un problema e 'NHPRof' ti dirà se hai un problema. – Rippo

Problemi correlati