Выражения против Lambdas - PullRequest
       3

Выражения против Lambdas

5 голосов
/ 22 августа 2011

Я знаю, что такое лямбда-выражение.

Но я не уверен, что это то же самое, что и Expression.Кажется, здесь нужно знать больше, чем я знаю.

Я смотрю на , оборачивая IQueryable , и в нем часто используются выражения.Так, например, есть ли здесь больше параметра «Выражение», чем можно представить в лямбде?

public InterceptedQuery(InterceptingProvider provider, Expression expression) 
{ 
    this._provider = provider; 
    this._expression = expression; 
}  

Ответы [ 2 ]

4 голосов
/ 22 августа 2011

A лямбда-выражение - это функция компилятора, которая в зависимости от контекста компилируется в одну из двух вещей:

  • (скрытая) функция и делегат ей
  • An Expression

После того, как приложение скомпилировано, концепция лямбда-выражения не существует, поскольку она превращена в один из двух указанных выше вариантов.

Я не уверен, что вы подразумеваете под

, здесь есть больше параметра 'Выражение', чем можно представить в лямбде

Anвыражение инкапсулирует и выражает логику приложения в инспектируемой форме (другими словами, оно позволяет увидеть, что разработчик написал в терминах вызванных свойств и функций, включенных констант, сравнений и т. д.).Вот как поставщики запросов (по большей части объектно-реляционные сопоставители, такие как Entity Framework) берут код и превращают его в SQL.

1 голос
/ 22 августа 2011

Лямбды - это, как правило, скомпилированный код, где Expression представляет «абстрактные синтаксические деревья» (AST), т.е. структура данных, которая представляет код и может быть скомпилирована в код. Обычно IQueryable работает на Expression, потому что он должен компилировать AST для кода, который выполняется в разных средах, таких как SQL-сервер, а не только на главном компьютере. Существуют IQueryableProviders, которые компилируются в SQL (Linq2Sql), в JavaScript, в шейдеры OpenGL (Bling) и т. Д.

Компилятор C # может иногда превращать лямбду в выражение, если параметр метода ожидает выражение правильного типа:

void Foo(Expression<Func<int>>) { ... }
...
Foo(() => 3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...