Me gustaría implementar MVC mientras uso LINQ (específicamente, LINQ-to-entities). La forma en que haría esto es hacer que el Controlador genere (o llame a algo que genere) el conjunto de resultados usando LINQ, luego regréselo a la Vista para mostrar los datos. El problema es, si lo hago:Forma simple de devolver tipos anónimos (para hacer posible MVC usando LINQ)
return (from o in myTable select o);
Todos las columnas se leen de la base de datos, incluso los que (potencialmente decenas) que no quiero. Y - más importante - que no puede hacer algo como esto:
return (from o in myTable select new { o.column });
porque no hay manera de hacer con seguridad de tipos anónimos! Sé con certeza que no hay una forma agradable y limpia de hacerlo en 3.5 (this no está limpio ...), , pero ¿qué hay de 4.0? ¿Hay algo planeado, o incluso propuesto? Sin algo así como duck-typing-for-LINQ, o valores de retorno anónimos seguros de tipo (me parece que el compilador sin duda debería ser capaz de eso), parece ser casi imposible separar limpiamente el controlador de la vista.
Cuando trabaje con un orm, debería acostumbrarse a la idea de que sql seleccione todas las columnas de una tabla. Si escribe consultas que seleccionan solo unas pocas, podría estar utilizando sql en primer lugar. Si tiene docenas de propiedades en sus objetos, ese es su problema. Tus objetos deberían ser más pequeños y deberías pensar en cómo solucionarlos. Los tipos anónimos no deben pasarse, especialmente no como modelos a una vista. –
@Mattias: Desafortunadamente, la vida no es tan simple. Por ejemplo, considere el caso en el que selecciono algunas columnas de diferentes tablas, incluida una matriz de objetos seleccionados utilizando una consulta interna LINQ. Por lo que sé, no hay forma de devolverlo como un solo objeto EF, tiene * que ser un tipo nuevo, y la definición de un nuevo tipo concreto para cada consulta como esta es ridículamente engorroso. –
Me parece que tienes un modelo bastante malo. Su objeto debe tener las referencias que necesita y puede simplemente usar el método "Include()" en EF (para cargar esos datos). Si deja de pensar en los datos como columnas diferentes en diferentes tablas, y más acerca de su modelo (más OO), será mucho más fácil trabajar con ellos. En pocas palabras: si sientes la necesidad de pasar tipos anónimos, lo más probable es que estés haciendo algo mal. –