¿Convertir la consulta LINQ en una cadena, enviarla a un servidor remoto para analizarla en una expresión usando Roslyn?

Tengo una fuente de datos como IDataSource : IEnumerable<IDynamicObject>

Una implementación es consultar datos XML puros y otra es consultar una base de datos SQL.

Mis fuentes de datos no tienen tipos concretos y solo funcionan contra tipos de esquema simples.

En algunos escenarios, estas fuentes de datos se instancian en el mismo contexto de tiempo de ejecución y en otras se accede a través de la red.

No pude consultar mis fuentes de datos con LINQ, y planeo usar objetos dinámicos para solo extraer y analizar los valores de los miembros que son parte de la consulta real.

Esto funciona bien cuando se ejecuta en el mismo contexto de tiempo de ejecución, pero cuando la fuente de datos está detrás de un servicio web en un servidor remoto, esto falla porque no puedo usar LINQ con un servicio web de ninguna manera que yo sepa.

Así que estaba buscando un método para formatear mis consultas LINQ como una cadena y enviar esto al servidor, luego analizarlo de nuevo en una expresión y ejecutarlo en el nuevo contexto.

Dos métodos de análisis sintáctico que pude encontrar fueron LINQ dinámico y HUIR. Solo los he mirado brevemente, pero ninguno de ellos parecía ser capaz de formatear una expresión en una cadena y analizarla.

Leí sobre el proyecto Roslyn y estaba pensando que tal vez podría usarse para este problema. ¿Alguien sabe más sobre eso?

He mirado algunos IQueryable<TData> también, pero he leído muchas cosas negativas al respecto, así que tal vez debería evitarlo. También está fuertemente tipado, lo que no se ajusta a mis necesidades porque no quiero ningún tipo concreto en el servidor de datos. Tampoco veo cómo se puede usar esto en un servicio web, ya que está fuertemente tipado. ¿Me estoy perdiendo de algo?

preguntado el 10 de marzo de 12 a las 16:03

¿Qué cosas negativas has leído? IQueryable<T>? ¿Y podría explicar por qué cree que es importante que esté fuertemente tipado? -

Eso es muy pesado de implementar principalmente. Todavía no lo he mirado mucho, pero necesito consultar sobre un servicio web, en el que no tengo ningún tipo de datos concreto. Entonces, ¿cómo podría usar IQueryable? en ese escenario? -

¿Por qué no tiene tipos de datos concretos? Ciertamente puede tenerlos cuando utilice un servicio web. -

3 Respuestas

Roslyn eventualmente le dará la capacidad de tomar una expresión LINQ en forma de cadena, analizarla y evaluarla. Sin embargo, el CTP público actual (el que se publicó en octubre de 2011) no admite expresiones LINQ.

respondido 11 mar '12, 02:03

Esto suena más a que lo que necesita es poder serializar árboles de expresión, pero no necesariamente como una cadena C #.

El Serialización del árbol de expresión muestra en MSDN hace exactamente eso. Incluso incluye un servicio WCF de muestra y un cliente que hace exactamente lo que desea, utilizando IQueryable<T>.

respondido 10 mar '12, 16:03

Creo que he encontrado mi respuesta ahora:

Servicios de datos WCF!

¡Cómo pude haberme perdido eso! Pensé que era solo para Entity Framework ...

respondido 19 mar '12, 17:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.