Recientemente tuve un poco de shock al pensar en combinar una arquitectura orientada a servicios con una interfaz de usuario brillante que aprovecha SQL para optimizar el rendimiento al consultar datos.Consultando servicios web con SQL
La vista de cuadrícula DevExpress para ASP.NET, por ejemplo, es tan genial que delega toda la lógica de filtrado, clasificación y paginación en el servidor de la base de datos. Pero esto supone que los datos son recuperados de un servidor de base de datos con capacidad SQL.
¿Qué sucede si quiero introducir una capa de servicio web entre la base de datos y las capas de la interfaz de usuario, y que la interfaz de usuario use los servicios web para consultar los datos?
- ¿Cómo puedo diseñar los servicios web y la interfaz de usuario para que pueda pasar las solicitudes de filtrado desde la interfaz de usuario a través de los servicios web a la base de datos?
- ¿Necesito proporcionar un servicio web de estilo
List QueryData(string sqlQuery)
y tener que analizar la cadena SQL por mi cuenta para garantizar la seguridad/restricción de acceso? - ¿O hay algún buen marco o directriz de diseño que me quite esta carga?
Esto debe ser un problema muy común, y estoy seguro de que ya se ha resuelto de manera relativamente adecuada, ¿o sí?
Estoy interesado principalmente en una solución compatible con .NET/C#.
Editar: He encontrado OData y Microsoft WCF Data Services. Si lo hizo bien, una aplicación basada en OData podría ser como sigue:
- usuario ---/Dadme página 1 (registros 1..10)/--->servidor ASP.NET control de (por supuesto, a través de HTTP)
- control de servidor ASP.NET ---/LINQ consulta/--->servicio de datos de clientes
- cliente de servicios de datos ---/OData consulta/--->WCF Data Service
- WCF Service Data ---/LINQ Consulta/--->Marco de la entidad
- Entity Framework ---/consultas SQL/--->base de datos
Si lo hago bien, mi control de servidor DevExpress debería poder delegar una solicitud de filtrado (por ejemplo, déjame los 10 primeros solamente) a través de todas estas capas hasta la base de datos que luego aplica sus índices, etc. para realizar esa consulta.
¿Es correcto?
Edit: Es una alegría ver cobrar vida este hilo :-) Es difícil decidir qué respuesta aceptar porque me parecen igualmente buenas ...
¿Estás seguro de que no "solo" necesitas implementar IQueryable y hacer llamadas al servicio web al back-end? No estoy familiarizado con el componente ... –
buena pregunta, he estado luchando con esto pero nunca se me ocurrió una solución elegante. En implementaciones anteriores, proporcioné un parámetro "filtro" personalizado para mis métodos de servicio (que al final se analiza en una cláusula WHERE), y luego en los servicios agregué algunos criterios adicionales para garantizar la restricción de acceso. Editar: en ese caso trabajé con Telerik Grid, que genera filtros como consultas OQL – Ozzy
@Vincent: la implementación de IQueryable es probablemente una parte de la historia, pero la menor: permite el uso de LINQ en la capa de presentación, pero no resuelve (?) el problema de cómo hacer que el filtrado y la clasificación sean delegados al DBMS. – chiccodoro