¿Cómo crear una expresión Linq dinámica basada en lambda a partir de una cadena en C #?

Tengo algunas dificultades para crear expresiones Linq basadas en Lambda a partir de una cadena. Aquí está mi caso básico usando este objeto / clase de muestra:

public class MockClass { public string CreateBy { get; set; } } 

Básicamente necesito convertir una cadena como esta:

 string stringToConvert = “x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase”; 

En una expresión para predicar / linq:

 System.Linq.Expressions.Expression<Func> or in this example System.Linq.Expressions.Expression<Func> 

Entonces es equivalente a la expresión Linq dentro del método Where a continuación:

 query = query.Where(x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase)); 

He intentado usar los siguientes ayudantes, pero parece que no puedo encontrar la forma de hacer que funcionen en este tipo de casos en los que quiero poder construir una expresión linq a partir de una cadena que no se sabe con antelación: http: //www.albahari.com/nutshell/predicatebuilder.aspx

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx (ahora está disponible como un paquete NuGet como bien llamado “DynamicQuery”)

Una pregunta similar se hizo aquí:

¿Hay una manera fácil de analizar una cadena (expresión lambda) en un delegado de acción?

Como lo entiendo, esta ‘Consulta dinámica’ es en realidad un marco para pasar restricciones para una cláusula Where sin usar una expresión lambda.

El significado de eso es que las expresiones lambda no son métodos dynamics, son métodos anónimos. Si alguna vez echas un vistazo a un ensamblaje, verás que tus expresiones lambda se convierten en cierres con variables libres como campos. La clase tiene un método con una firma que coincide con la suya, las variables de campo se asignan en el punto de invocación.

Una buena manera de pensar sobre esto es que implica que el comstackdor c # interpreta su expresión lambda en tiempo de comstackción, y que las variables se resuelven mediante la instanciación de un objeto de esta clase en tiempo de ejecución.

Para demostrar esto, considere lo siguiente:

 var myLambda = x => x * x 

Notarás que esto no funciona. Esto se debe a que, para crear la clase / método relacionado, el comstackdor debe conocer, en tiempo de comstackción, el tipo de x.

Todo esto es importante porque la noción de una expresión lambda no existe en el CLR en tiempo de ejecución (en la misma forma que está en el código). Una cadena que se parece a una expresión lambda es exactamente eso …