2009-09-24 10 views
5

A menudo necesito combinar datos de varias tablas y mostrar el resultado en un control GridView.Pregunta de diseño de Linq a SQL

Puedo escribir una consulta de Linq en línea en el evento Page_load, devolver un tipo anónimo que combine todos los campos que necesito y relacionar el resultado con el control GridView.

  • Problema: Uso 'métodos de ayuda' como se describe en Scott Guthrie on his blog. Tal método auxiliar no puede devolver un tipo anónimo. La consulta debería estar en línea para este enfoque.

Puedo escribir una vista de base de datos que devuelve los datos que necesito, y escribir un método de ayuda con una consulta contra este tipo (nuevo y conocido) que devuelve.

  • Problema: Necesitaré muchas vistas en el esquema de mi base de datos, y presentaré muchos aspectos redundantes de mis datos. También pierdo algo de la ventaja de usar Linq, eliminando toda la lógica comercial de la base de datos.

Me gustaría tomar un enfoque que me permita mantener las consultas de Linq en métodos de ayuda, pero me permite acceder a todos los atributos que necesito en la cuadrícula en sus respectivas expresiones de enlace de datos. Se puede hacer esto?

+0

¿Esto es C#? Si es así, obtendrá más vistas al agregar una etiqueta C#. Supongo que ASP.NET, si está utilizando el control GridView. –

+0

No creo que el idioma sea importante. – cdonner

Respuesta

1

Hice la pregunta incorrecta, como hago con frecuencia. Lo que me impulsó a buscar tipos anónimos fue una aparente limitación de GridView: mi incapacidad para usar una expresión de enlace de datos en un <asp:BoundField> (el parámetro DataField solo acepta los nombres de columna de la tabla que extrae la consulta Linq).

Resulta que en un TemplateField es es posible utilizar Eval y acceder a los miembros del elemento de datos Linq, y Linq se encarga de la consulta por mí. En otras palabras, puedo mantener la consulta en mi método de ayuda, hacer que devuelva un tipo de tabla de base de datos primaria (por ejemplo, Cuenta) y vincular las Cuentas a GridView. En las expresiones de enlace de datos, puedo acceder a los miembros de datos de los objetos de Cuenta que residen en otras tablas, sin tener que extraerlos explícitamente en la consulta. Perfecto.

0

No sé si hay una forma viable de lograr esto utilizando tipos anónimos. Pero tengo una sugerencia de que funcionará en WinForms, pero no estoy seguro acerca de ASP.NET.

Lo que necesita es un tipo con propiedades donde no se conoce el número de propiedades, ni los tipos y nombres de las propiedades en tiempo de compilación. Una forma de crear tal cosa es ICustomTypeDescriptor.

Debe crear un tipo que implemente esta interfaz con un almacén de respaldo privado de los objetos que respaldan las propiedades devueltas por la consulta para una fila de la consulta. Luego implementa GetProperties() para devolver un PropertyDescriptor por columna y PropertyDescriptor.GetValue() y PropertyDescriptor.SetValue() para acceder a la matriz de respaldo.

Al implementar PropertyDescriptor.Name obtendrá el nombre de columna correcto; esto probablemente requerirá que otra tienda de respaldo almacene los nombres de las propiedades. Y hay mucho más por implementar, pero al final su nuevo tipo se comportará casi como un tipo normal, y ahora el if, si el control al que está vinculando conoce y usa ICustomTypeDescriptor.

ACTUALIZACIÓN

solo he encontrado un fragmento de texto que indica que el enlace de datos de ASP.NET conoce y utiliza ICustomTypeDescriptor.

+0

@ Daniel Sugerencia interesante: resulta que la solución es mucho más simple, vea mi propia respuesta. – cdonner

0

post anterior de Scott en la serie habla de la conformación del conjunto de resultados antes de insertarlo en una cuadrícula:

Part 3 - Querying our Database

vaya a "configuración de nuestro Resultados de la consulta".

+0

Leí esta parte también, y de ahí viene mi confusión: en esta parte usa consultas en línea para enlazar tipos anónimos a la grilla, lo que funciona muy bien para consultas en línea, pero el enfoque se rompe cuando sigues su consejo de la parte 9 para extender el DataContext. – cdonner