¿Cómo puedo pasar una expresión lambda a un servicio WCF?

Mi proyecto actual usa la architecture IDesign, por lo que todas mis capas son servicios. Quería que mi método de lectura en el CRUD de mi capa de acceso a los recursos tomara un predicado en forma de expresión lambda y una lista de objetos relacionados para extraer. De esta manera, la capa de acceso a los recursos será muy genérica.

[OperationContract] Result ReadObjects(Func predicate, string[] includes); 

Ahora he descubierto algo que debería haber sido obvio, y es que no puedo serializar expresiones lambda. Intenté analizar una cadena en una expresión lambda, pero eso es un no ir también.

¿Hay algún método que pueda usar para pasar una expresión lambda a un servicio? ¿Hay una mejor manera de hacer lo que estoy tratando de hacer?

Tal vez una consulta dinámica funcionaría en su situación?

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Pasaría una cadena de cláusulas where al servicio que validaría y convertiría a una expresión

Tenemos que resolver este problema en LINQ-to-Just-About-Everything. Por ejemplo, al hacer LINQ-to-SQL:

 var results = from c in customers where c.City == "London" select c.Name; 

de alguna manera, el contenido de lambdas c=>c.City == "London" c=>c.Name debe terminar en el servidor SQL de una forma que el servidor entienda. Claramente no podemos persistir las lambdas en el servidor.

En cambio, lo que hacemos es convertir las lambdas en Expression Trees, analizar los árboles de expresiones en tiempo de ejecución, crear una cadena de SQL real y enviar esa cadena al servidor para su procesamiento.

Puedes hacer lo mismo. Crea un lenguaje de consulta para tu servidor. Del lado del cliente, convierta las lambdas en árboles de expresión. Analícelos en tiempo de ejecución, convierta el resultado en una cadena en su lenguaje de consulta y luego envíe la consulta al servicio.

Si le interesa cómo funciona esto en LINQ, el arquitecto LINQ-to-SQL Matt Warren ha escrito una larga serie de artículos de blog sobre cómo hacerlo usted mismo:

http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx

WCF no ofrece esto de la caja. En esencia, tendría que escribir un serializador personalizado que tomara expresiones lambda y convirtiera el árbol de expresiones en un dato serializable.

Así es como funciona WCF DataServices. Usas lambdas en tu código de cliente, descompone esas expresiones lambda en cadenas que pasa en la cadena de consulta al servicio de datos que luego convierte la cadena nuevamente en una lambda que aplica a un IQueryable en el lado del servidor.

Puede hacerlo, pero tendrá que escribir muchos códigos de serialización personalizados para esto. Además, seamos claros, estas serían expresiones lamdba , no métodos lambda completos que contienen código aleatorio que alguna vez podría ejecutarse en el lado del servidor.

Uso esta biblioteca en CodePlex para serializar / deserializar árboles de Expresión (pero su versión anterior), y hace el trabajo.

También hay algunas otras preguntas similares aquí como esta: serializar y deserializar árboles de expresión en C #

Cree un objeto de consulta y páselo a sus servicios.

Vea si esto ayuda:

http://ruijarimba.wordpress.com/2011/05/09/entity-framework-and-t4-generate-query-objects-on-the-fly-part-1/

Un ejemplo:

 var search = new AlbumSearch(); search.PriceFrom = 5; search.PriceTo = 10; search.Artist = new ArtistSearch(){ Name = "Metallica" }; search.Genre = new GenreSearch(){ NameContains = "Metal" }; var albuns = from x in repository.All(search.GetExpression()) select x; 

Encontré un proyecto de código abierto en Codeplex es la solución de este problema como sujeto

Serializador de árbol de expresiones

Descripción del proyecto una biblioteca de clases .NET 4.0 y Silverlight 4 que serializa y deserializa las instancias de expresión. Además: un cliente WCQ IQueryable LINQ y Http Web (REST) ​​para Silverlight que proporciona una API de cliente REST simplificada (es decir, WebChannelFactory de WCF) que es más fácil de usar que WebClient.

en este enlace

http://expressiontree.codeplex.com/