2009-04-29 8 views
9

Vous vous demandez s'il existe un moyen d'obtenir les expressions lambda résultant d'une expression de syntaxe "requête" LINQ.Syntaxe des requêtes LINQ sur Lambda

Étant donné:

var query = from c in dc.Colors 
      where c.ID == 213 
      orderby c.Name, c.Description 
      select new {c.ID, c.Name, c.Description }; 

Est-il possible d'obtenir le code généré "lambda"/expression?

var query = dc.Colors 
    .Where(c => c.ID == 213) 
    .OrderBy(c => c.Name) 
    .ThenBy(c => c.Description) 
    .Select(c => new {c.ID, c.Name, c.Description, }); 

Je sais que ce sont des exemples très simples et que le compilateur C# génère une expression lambda de l'expression de requête lors de la compilation du code. Est-il possible d'obtenir une copie de cette expression? Je souhaite utiliser ceci comme un outil de formation pour certains membres de mon équipe qui ne sont pas très à l'aise avec les expressions lambda. En outre, j'ai utilisé Linq Pad, mais idéalement, cela peut être accompli sans un outil tiers.

Répondre

5

aller simplement:

string lambdaSyntax = query.Expression.ToString(); 

L'inconvénient par rapport à LINQPad est que le résultat est formaté sur une seule ligne.

+0

Cela produit des résultats similaires à ceux trouvés en utilisant Reflector sur votre assembly. Tous les appels de méthodes statiques contre des types anonymes nommés fous. Pas idéal. – andleer

+0

C'est mieux que ce que vous voyez dans Reflector - et c'est aussi bon que vous l'aurez sans outils tiers. –

+0

Aimez votre livre. J'ai acheté quelques exemplaires pour les membres de l'équipe. – andleer

3

Vous pouvez essayer de compiler l'ensemble et de le regarder à l'aide de Reflector. Cela peut être un peu plus compliqué que vous voulez, car le compilateur va compiler les choses jusqu'aux appels de méthode directs (tout sera des appels de méthodes statiques, pas des méthodes d'extension, et les lambdas seront compilés dans leur propre les fonctions qui sont généralement appelés quelque chose comme <ClassName>b_88f)

Vous allez certainement comprendre ce qui se passe bien :-)

+0

Le réflecteur est un outil merveilleux! Points bonus car vous pouvez l'utiliser pour regarder le code .net pour à peu près n'importe quel assemblage .net. –

2

ReSharper a cette fonction. Il faudra un LINQ à Lambda et revenir à la suite d'une touche. Aussi très (très) utile pour d'autres choses.

+0

Vraiment essayer d'éviter les outils tiers. – andleer