Хорошо, я просто не получаю его.
Я читал приблизительно столько же, сколько я могу на предмете, не зная то, о чем это - все:
API деревьев выражений изначально был написан для создания настраиваемых поставщиков LINQ. По сути, если вы используете LINQ to Objects, вы не имеете дело с деревьями выражений. Но если вы работаете с LINQ to SQL, то поставщик LINQ работает с деревьями выражений.
В .Net 4.0 API деревьев выражений был расширен и активно используется DLR. Итак, если вы, скажем, собираетесь добавить новый динамический язык в .NET, он вам понадобится.
Как это часто бывает, люди нашли больше способов использовать деревья выражений. Иногда вы можете использовать ET для получения дополнительной информации об объектах вместо отражения. В .NET 4 вы также можете использовать их для создания динамических методов. Но помните, что это больше похоже на продвинутые приемы, чем на рекомендуемые сценарии.
Вот несколько ссылок, на которые вы можете взглянуть:
Получение информации об объектах, типах и членах с деревьями выражений
Создание динамических методов с деревьями выражений в Visual Studio 2010
Дерево выражений - это, по сути, проанализированный фрагмент кода, обрабатываемый для вас как данные. Затем ваша программа может интерпретировать эти данные по своему усмотрению во время выполнения. Это позволяет интерпретировать код в свете вашей бизнес-логики.
Допустим, вам нужно определить бизнес-правила. Вы можете определить для них синтаксис на основе C #, а затем записать новое правило прямо в исходный код. Приняв его в свой движок как дерево выражений, утомительная работа по синтаксическому анализу, проверке синтаксиса и проверке типов уже сделана за вас. Вам просто нужно пробежать по дереву и применить правило.
Они весьма полезны. Помимо linq to sql, они используются для создания строго типизированных помощников html в mvc 2.0 или для предоставления средств использования графического процессора для математических вычислений, например проекта Brahma .
Обычно деревья выражений дают возможность интерпретировать скомпилированное выражение вместо его выполнения. Таким образом, они являются средством создания своего рода DSL на C #.
Они действительно очень полезны.
Каждое лямбда-выражение может стать методом или деревом выражения.
Очевидно, что методы выполняются встроенными в структуру.
Деревья выражений могут быть переведены в другое представление. Например, LINQ для SQL преобразует выражения запроса в синтаксис SQL и выполняет их удаленно на сервере.
Предположим, что вы пишете поставщик запросов для LINQ (например, поставщик SQL Server, который переводит запросы LINQ в SQL) - возможно, вы являетесь поставщиком БД и хотите реализовать поддержку своего механизма БД. Вы использовали бы деревья выражений для построения своего sql.
Когда вы пишете что-то вроде этого:
var q = from d in Data.Table
where d.Name == "SomeName"
select d
Это преобразуется в дерево выражений. Когда вы используете этот linq-запрос против SQL, подложка Linq-to-SQL использует это дерево для создания высокопроизводительного SQL-запроса.
Таким образом, он используется "за сценой", когда вы выполняете linq-запросы.
Вы можете строить свои собственные деревья выражений. Это может быть очень полезно, если вы хотите делать динамические запросы. Это могут быть различные критерии поиска. Вы даже можете использовать его для создания множественных внутренних объединений с пунктами "где" и другими интересными вещами, даже не зная заранее используемых типов. Однако это требует некоторых размышлений.