2010-06-08 6 views
1

Je travaille sur un projet qui utilise la bibliothèque PredicateBuilder http://www.albahari.com/nutshell/ d'Albahari pour créer dynamiquement une expression linq au moment de l'exécution. Je voudrais trouver un moyen de traduire ce prédicat linq créé dynamiquement de type Expression < Func < T, bool > > en une instruction lisible en anglais à l'exécution.Comment traduire par programme une requête LINQ en texte anglais lisible qui décrit correctement l'expression linq?

Je vais faire une déclaration LINQ statique créée à titre d'exemple:

de p dans les achats
sélectionnez p
où p.prix> 100 & & p.Description = "Bike"!.

Pour cette déclaration LINQ Je veux générer dynamiquement lors de l'exécution une description en anglais le long des lignes de:

« Vous cherchez des achats dont le prix est supérieur à 100 et la description est pas de vélo ».

Existe-t-il des bibliothèques qui existent déjà pour atteindre cet objectif? N'oubliez pas que j'utilise PredicateBuilder pour générer dynamiquement le prédicat where. Si aucune solution n'existe, comment allez-vous construire une solution?

Merci!

+2

Je n'ai rien vu qui fasse cela, mais vous pourriez écrire un visiteur de l'arbre d'expression http://msdn.microsoft.com/en-us/library/bb882521(VS.90).aspx pour cela. –

+0

cela semble être une cible audacieuse. Je vous souhaite bonne chance. – Femaref

Répondre

0

Cela a attiré mon attention si je downloadedExpressionSerializationTypeResolver.cs et ExpressionSerializer.cs puis I:

class Purchase 
{ 
    public decimal Price {get;set;} 
    public string Description {get;set;} 
} 

...

var purchases = new List<Purchase>() { new Purchase() { Price = 150, Description = "Flute" }, new Purchase() { Price = 4711, Description = "Bike" } }; 

Expression<Func<IEnumerable<Purchase>>> queryExp =() => from p in purchases 
    where p.Price > 100 && p.Description != "Bike" 
    select p; 

ExpressionSerializer serializer = new ExpressionSerializer(); 
XElement queryXml = serializer.Serialize(queryExp); 

puis je suis entré dans des problèmes, mais peut-être que vous pourriez faire quelque chose avec le assez grand arbre d'expression de votre requête? Vous pouvez le trouver here.