2009-04-29 12 views
9

Se pregunta si hay alguna forma de obtener las expresiones lambda que resultan de una expresión de sintaxis LINQ "query".LINQ Query Sintaxis a Lambda

dado:

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

¿Hay alguna manera de obtener la generada "lambda" código/expresión?

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, }); 

Sé que estos son ejemplos muy simples y que el compilador de C# genera una expresión lambda de la expresión de consulta al compilar el código. ¿Hay alguna forma de obtener una copia de esa expresión?

Espero utilizar esto como una herramienta de entrenamiento para algunos de los miembros de mi equipo que no están muy cómodos con las expresiones lambda. Además, he usado Linq Pad, pero idealmente esto se puede lograr sin una herramienta de terceros.

Respuesta

5

simplemente vaya:

string lambdaSyntax = query.Expression.ToString(); 

La desventaja en comparación con LINQPad es que el resultado está formateado en una sola línea.

+0

Esto produce resultados similares a los encontrados al usar Reflector en su conjunto. Todas las llamadas al método estático contra tipos anónimos con nombre loco. No es ideal. – andleer

+0

Es mejor que lo que ve en Reflector, y es tan bueno como lo obtendrá sin herramientas de terceros. –

+0

Ame su libro. Compré algunas copias para los miembros del equipo. – andleer

3

Puede intentar compilar el conjunto y luego echarle un vistazo utilizando Reflector.

Esto puede ser un poco más complicado de lo que usted quiere, porque el compilador compilará las cosas directamente en las llamadas a métodos directos (todo será llamadas a métodos estáticos, no métodos de extensión, y las lambdas se compilarán en su propio funciones que normalmente se llama algo así como <ClassName>b_88f)

supuesto que va a averiguar lo que está pasando, aunque :-)

+0

¡El reflector es una herramienta maravillosa! Puntos de bonificación porque puede usarlo para ver el código .net de casi cualquier ensamblado .net. –

2

ReSharper tiene esa característica. Llevará un LINQ a Lambda y viceversa con solo presionar una tecla. También muy (muy) útil para otras cosas.

+0

Realmente tratando de evitar herramientas de terceros. – andleer

Cuestiones relacionadas