2011-04-02 22 views
7

que no tienen idea de lo que las palabras clave son tan aquí es un ejemplo de lo que quiero:¿Cómo convertir el objeto IQueryable <T> a otro objeto?

return from i in userRepo.GetUsers() 
    select new SimpleUser{ 
     i.UserId, 
     i.Name 
    }; 

userRepo.GetUsers() Devuelve el tipo IQueryable<User>. Me gustaría convertir esto a IQueryable<SimpleUser> para poder restringir el acceso a ciertas propiedades del dominio User.

¿Cómo puedo hacer esto sin tener que codificar la traducción de esta manera? ¿Qué pasa con las herramientas como Automapper o ValueInjecter, cómo pueden hacer esto?

Además, ¿cómo se llama esta técnica?

Respuesta

9

Debe codificar la traducción o debe convertirla primero al IEnumerable. IQueryable representa el árbol de expresiones traducido a alguna ejecución en proveedor usado; en su caso, creo que será el marco de Entidad. No puede usar ninguna asignación automática en dicha consulta porque se traducirá a SQL, lo que no comprenderá sus métodos .net o AutoMapper. Las proyecciones a tipos personalizados son parte de la consulta y deben estar codificadas. Puede crear método de extensión personalizada a IQueryable y reutilizarla donde se necesita:

public static IQueryabe<SimpleUser> ProjectToSimpleUser(this IQueryable<User> query) 
{ 
    return query.Select(u => new SimpleUser 
     { 
      // Here map your fields 
     }); 
} 

Ahora puede utilizar:

return repo.GetUsers().ProjectToSimpleUser(); 

En caso de Entity Framework SimpleUser no debe ser una entidad asignada.

+0

El código "u => u new SimpleUser" no se compila. Creo que la segunda "u" necesita ser eliminada. –

+0

@Nate: Sí, tienes razón. Fue un error tipográfico –

4

AutoMapper es la herramienta que desea; funciona a través de la reflexión y, a menos que le diga que haga lo contrario, mapeará las propiedades con el mismo nombre directamente.

Auto-mapping es la técnica.

3

Siempre que SimpleUser es assigneable de usuario (User es una interfaz de la clase base de SimpleUser), puede

var users = simpleUsers.Cast<User>(); 

opcionalmente con

var users = simpleUsers.Cast<User>().AsQueryable(); 

Y si no está seguro de si todos los artículos en realidad son usuarios, entonces puede usar OfType<User> en lugar de Cast<User>

Cuestiones relacionadas