2009-04-29 3 views
9

Удивление, если есть какой-либо способ получить выражения лямбда, которые вытекают из выражения синтаксиса запроса «LINQ».LINQ Query Syntax to Lambda

Дано:

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

Есть ли способ, чтобы получить сгенерированный "лямбда" код/​​выражение?

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

Я знаю, что это очень простые примеры, и что C# компилятор генерирует лямбда-выражение из выражения запроса при компиляции кода. Есть ли способ получить копию этого выражения?

Я надеюсь использовать это в качестве учебного пособия для некоторых членов моей команды, которые не очень удобны с лямбда-выражениями. Кроме того, я использовал Linq Pad, но в идеале это можно сделать без стороннего инструмента.

ответ

5

Просто зайдите:

string lambdaSyntax = query.Expression.ToString(); 

Недостаток по сравнению с LINQPad является то, что результат форматируется все на одну строку.

+0

Это дает похожие результаты, полученные с помощью Reflector на вашей сборке. Весь статический метод вызывает сумасшедшие анонимные типы. Не идеально. – andleer

+0

Это лучше, чем вы видите в Reflector - и это так же хорошо, как и без сторонних инструментов. –

+0

Любите свою книгу. Я купил несколько экземпляров для членов команды. – andleer

3

Вы можете попробовать скомпилировать сборку, а затем взглянуть на нее с помощью Reflector.

Это может быть немного сложнее, чем вы хотите, потому что компилятор скомпилирует все прямо прямо к прямым вызовам метода (все будут статические вызовы методов, а не методы расширения, а lambdas будут скомпилированы в свои собственные функции, которые обычно называют что-то вроде <ClassName>b_88f)

Вы, конечно, выяснить, что происходит, хотя :-)

+0

Рефлектор - замечательный инструмент! Бонусные баллы, потому что вы можете использовать его для просмотра кода .net для любой сборки .net. –

2

ReSharper имеет ту особенность. Он возьмет LINQ к Лямбде и снова за удар по ключу. Также очень (очень) полезно для других вещей.

+0

Действительно пытается избежать сторонних инструментов. – andleer