2012-02-10 10 views
6

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.

+0

Supongo que esto funcionó para alguien. Tengo un voto ... ¡W00t! – CrazyCoderz

Respuesta

2

Si utiliza Queryover entonces esta es la única manera.

Si realmente pensar menos líneas de código son preferibles, más intuitiva, o se sienta mejor con nosotros, entonces usted puede hacer ya sea: -

  1. crear una vista base de datos y crear mapings archivos de la vista con mutable="false" en su definición de clase y use protected set; en las propiedades de su clase
  2. Use el proveedor de LINQ, por ejemplo, .Query (vea este blog post para más información)
+0

El proveedor LINQ es ideal para tareas muy básicas, sin embargo, no estoy muy impresionado con el SQL generado por el proveedor LINQ. – CrazyCoderz

+0

Aceptando esto como la respuesta teniendo en cuenta que no señaló ningún problema terrible con el código que publiqué y sí proporcionó otra forma de lograr lo mismo. Gracias ... – CrazyCoderz

+0

No me preocuparía demasiado el SQL que genera el proveedor de linq hasta que encuentre que es un problema y 'NHPRof' realmente le dirá si tiene un problema. – Rippo

Cuestiones relacionadas