В чем именно смысл Деревьев Выражения? - PullRequest
9 голосов
/ 29 июля 2010

Хорошо, я просто не понимаю.

Я прочитал столько, сколько смогу на эту тему, не зная, что это такое:

  • Зачем использовать деревья выражений?
  • Что является реальным примером того, когда и как я буду их использовать?
  • Какая общая польза (ы) от их использования?

Ответы [ 6 ]

3 голосов
/ 29 июля 2010

API деревьев выражений изначально был написан для создания пользовательских провайдеров LINQ. По сути, если вы используете LINQ to Objects, вы не имеете дело с деревьями выражений. Но если вы работаете с LINQ to SQL, то поставщик LINQ работает с деревьями выражений.

В .Net 4.0 API деревьев выражений был расширен и широко используется DLR. Итак, если вы собираетесь, скажем, добавить новый динамический язык в .NET, он вам понадобится.

Как это часто бывает, люди находили больше способов использовать деревья выражений. Иногда вы можете использовать ET, чтобы получить больше информации об объектах вместо отражения. В .NET 4 вы также можете использовать их для генерации динамических методов. Но помните, что это скорее продвинутые трюки, а не рекомендуемые сценарии.

Вот несколько ссылок, на которые вы можете посмотреть:

Основы дерева выражений

Получение информации об объектах, типах и элементах с деревьями выражений

Создание динамических методов с деревьями выражений в Visual Studio 2010

3 голосов
/ 29 июля 2010

Дерево выражений - это, по сути, разобранный бит кода, который обрабатывается для вас как данные.Ваша программа может затем интерпретировать эти данные, как вам нравится во время выполнения.Это позволяет вам интерпретировать код в свете вашей бизнес-логики.

Скажем, вам нужно определить бизнес-правила.Вы можете определить синтаксис для них на основе C #, а затем написать новое правило непосредственно в исходном коде.Приняв его в свой движок в качестве дерева выражений, утомительная работа по синтаксическому анализу, проверке синтаксиса и проверке типов уже для вас.Вам просто нужно пробежать по дереву и применить правило.

2 голосов
/ 29 июля 2010

Когда вы пишете что-то вроде этого:

var q = from d in Data.Table
        where d.Name == "SomeName"
        select d

Превращается в дерево выражений. Когда вы используете этот запрос linq против SQL, нижележащий Linq-to-SQL использует это дерево для выполнения высокопроизводительного SQL-запроса.

Так что он используется «за кулисами», когда вы занимаетесь linq.

Вы можете создавать свои собственные деревья выражений. Это может быть очень полезно, если вы хотите делать динамические запросы. Это может быть другой вид критериев поиска. Вы даже можете использовать его для создания нескольких внутренних объединений с предложениями where и другими интересными вещами, даже не зная, какие типы вы используете заранее. Это требует некоторого размышления.

2 голосов
/ 29 июля 2010

Они действительно очень полезны.

Каждое лямбда-выражение может стать либо методом, либо деревом выражений.

Методы, очевидно, выполняются в рамках среды.

Выражениедеревья могут быть переведены в другое представление.Например, LINQ for SQL преобразует выражения запроса в синтаксис SQL и выполняет их удаленно на сервере.

0 голосов
/ 29 июля 2010

Они весьма полезны. Помимо linq to sql они используются для создания строго типизированных помощников по html в mvc 2.0 или для предоставления средств для использования графического процессора для математических расчетов, например проект Брахмы .

По сути, деревья выражений дают возможность интерпретировать скомпилированное выражение вместо его выполнения. Таким образом, они являются средством для создания своего рода DSL в C #.

0 голосов
/ 29 июля 2010

Предположим, что вы писали поставщик запросов для LINQ (например, поставщик SQL Server, который переводит запросы LINQ в SQL) - возможно, вы являетесь поставщиком БД и хотите реализовать поддержку своего механизма БД.Вы бы использовали деревья выражений для построения вашего sql.

...