2011-01-25 8 views
33

Necesito una forma de recrear informes generados dinámicamente en algún momento en el futuro. Para resumir, necesito almacenar una consulta específica de linq (diferente para cada informe) en la base de datos y luego ejecutar la consulta con Linq dinámico más adelante.Conversión de expresión <T, bool> en la cadena

Esto está muy bien, pero no puedo encontrar la forma de convertir la expresión a cadena.

como en:

Expression<Func<Product, bool>> exp = (x) => (x.Id > 5 && x.Warranty != false); 

debe convertirse en:

"Product.Id > 5 && Product.Warranty != false" 

¿Hay una manera de hacer eso?

+2

Creo que estás preguntando 'Expression >', he modificado tu pregunta. –

+0

Sí, eso es correcto, dejé la parte func. –

+0

Quizás esto ayude: http://code.msdn.microsoft.com/exprserialization – sinelaw

Respuesta

38

Este puede no ser el mejor método o el más eficiente, pero funciona.

Expression<Func<Product, bool>> exp = (x) => (x.Id > 5 && x.Warranty != false); 

string expBody = ((LambdaExpression)exp).Body.ToString(); 
// Gives: ((x.Id > 5) AndAlso (x.Warranty != False)) 

var paramName = exp.Parameters[0].Name; 
var paramTypeName = exp.Parameters[0].Type.Name; 

// You could easily add "OrElse" and others... 
expBody = expBody.Replace(paramName + ".", paramTypeName + ".") 
       .Replace("AndAlso", "&&"); 


Console.WriteLine(expBody); 
// Output: ((Product.Id > 5) && (Product.Warranty != False)) 
+0

Muy bien, muchas gracias! –

Cuestiones relacionadas