2011-01-25 15 views
33

Ho bisogno di un modo per ricreare i report generati dinamicamente ad un certo punto nel futuro. Per farla breve, ho bisogno di memorizzare una specifica query linq (diversa per ogni report) nel database e quindi eseguire la query con Linq dinamico in seguito.Conversione di espressione <T, bool> in stringa

Questo va tutto bene, ma non riesco a trovare un modo per convertire l'espressione in stringa.

come in:

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

dovrebbe diventare:

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

C'è un modo per farlo?

+2

Penso che stai chiedendo 'Espressione >', Ho modificato la tua domanda. –

+0

Sì, è corretto, ho lasciato la parte della funzione fuori. –

+0

Forse questo aiuterà: http://code.msdn.microsoft.com/exprserialization – sinelaw

risposta

38

Questo potrebbe non essere il metodo migliore/più efficiente, ma è lavoro.

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

Molto bello, grazie mille! –

Problemi correlati