2011-01-25 2 views
33

J'ai besoin d'un moyen de recréer des rapports générés dynamiquement à un moment donné dans le futur. Pour faire court, je dois stocker une requête linq spécifique (différente pour chaque rapport) dans la base de données, puis exécuter la requête avec Linq dynamique plus tard.Conversion d'expression <T, bool> en chaîne

Tout cela est bien, mais je ne trouve pas de moyen de convertir l'expression en chaîne.

Comme dans:

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

devrait devenir:

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

Est-il possible de le faire?

+2

Je pense que vous demandez 'Expression >', j'ai modifié votre question. –

+0

Oui, c'est vrai, j'ai quitté la partie func. –

+0

Peut-être cela aidera: http://code.msdn.microsoft.com/exprserialization – sinelaw

Répondre

38

Cela peut ne pas être la meilleure/méthode la plus efficace, mais fonctionne.

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

Très gentil, merci beaucoup! –