Как компилятор C # обрабатывает выражения запросов? (Dotnet 3.5, C # 3.0) - PullRequest
1 голос
/ 18 июня 2010

Переходя к одному из моих любимых вопросов автора Какой самый сложный или наиболее неправильно понятый аспект LINQ? Я в основном ищу ответ на вопрос:

Как C #Компилятор обрабатывает выражения запроса

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 июня 2010

Ответ может отличаться у разных поставщиков LINQ.

Вообще говоря, выражения запросов LINQ или цепочки методов преобразуются в дерево выражений, прежде чем оно перейдет к реализации, специфичной для поставщика.

Что касается LINQ to Objects (IEnumerable), дерево выражений компилируется в набор делегатов System.Func или System.Action.

Что касается LINQ to SQL (IQueryable), дерево выражений преобразуется в операторы T-SQL.

0 голосов
/ 18 июня 2010

Компилятор оценит и преобразует ваши выражения запроса в эквивалентный лямбда-синтаксис перед дальнейшей компиляцией кода. Так что код, который начинается как

 var query = from foo in foos 
             where foo.Bar == someString
             select new 
             {
                 Baz = foo.Baz,
                 Id = foo.Id
             };

Будет преобразован в лямбда-версию

 var query = foos.Where(f => f.Bar == someString).Select(f => new { Baz = f.Baz, Id = f.Id });

То же самое произойдет с вашими сложными объединениями, группировками и т. Д.

...