Дерево выражений - PullRequest
       10

Дерево выражений

5 голосов
/ 28 марта 2010

Я понимаю дерево выражений так:

Деревья выражений представляют собой представление в памяти выражения, такого как арифметическое или логическое выражение. Выражения сохраняются в разобранном дереве. Поэтому мы можем легко перевести их на любой другой язык.

Linq to SQL использует дерево выражений. Обычно в LINQ to SQL запросе компилятор переводит его в проанализированные деревья выражений. Они передаются на Sql Server в виде операторов T-SQL. Сервер Sql выполняет запрос T-SQL и отправляет результат обратно. Вот почему при выполнении LINQ to SQL вы получаете IQueryable<T>, а не IEnumetrable<T>. Потому что IQuerybale содержит

public IQueryable:IEnumerable
{

   Type Element {get;}
   Expression Expression {get;}
   IQueryaleProvider Provider {get;}
}

Вопросы:

  1. Microsoft использует деревья выражений для игры с LINQ-to-Sql. Какими способами я могу использовать деревья выражений для улучшения своего кода.

  2. Помимо LINQ to SQL, Linq to amazon, кто использовал деревья выражений в своих приложениях?

  3. Linq to Object возвращает IEnumerable, Linq to SQL возвращает IQueryable, Что возвращает LINQ to XML?

Ответы [ 5 ]

11 голосов
/ 28 марта 2010

Деревья выражений предлагают способ проверки некоторого фрагмента кода перед его фактической компиляцией во время выполнения.

Вы можете сделать ровно две вещи с деревом выражений:

  • Скомпилируйте его в делегат, используя Expression.Compile или
  • Посетите узлы дерева и сгенерируйте что-нибудь еще из него (например, оператор SQL).

Деревья выражений - это круто, но шансы на то, что они имеют какую-либо прямую полезность для типичного веб-сайта или корпоративного приложения, являются удаленными. Вы можете использовать их только тогда, когда вы (а) хотите сгенерировать код другого типа из источника C # во время выполнения или (б) хотите использовать Reflection, но обеспечите некоторую степень безопасности во время компиляции.

Если вы работаете с библиотеками многократного использования - средами DI, средами AOP, средами MVC / MVP / MVVM, средами ORM и т. Д., Или пытаетесь расширить одну из этих сред (включая Linq-to-XYZ), то вы вероятно, найдут применение для деревьев выражений (таких как расширение Linq to SQL пакетное обновление ), хотя трудно обсудить конкретные примеры, потому что это будет полностью зависеть от конструкции такого основа.

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

Несколько примеров библиотек, использующих деревья выражений:

... Это должно дать вам представление о том, какие проекты серьезно используют деревья выражений. Поэтому, если вы создаете свою собственную среду выполнения или MVC, вам определенно нужно изучить все, что вы можете. ;)

3 голосов
/ 28 марта 2010
  1. Что вы подразумеваете под «повысить мой код»?
    Деревья выражений не будут (обычно) увеличивать производительность; они используются для включения дополнительных функций.
  2. Деревья выражений не имеют ничего общего с LINQ. Например, они используются системами внедрения зависимостей для указания типов и эффективного функционирования.
  3. LINQ to XML возвращает IEnumerable<XElement> с.
1 голос
/ 30 марта 2010

Я бы рекомендовал прочитать некоторые статьи здесь: http://blogs.msdn.com/csharpfaq/archive/tags/expression+trees/default.aspx

Я написал их, чтобы ответить на такие вопросы, как этот. Я попытался дать основы и показать некоторые интересные трюки, которые можно сделать с деревьями выражений вне LINQ и DLR.

0 голосов
/ 26 февраля 2017

Немногие сценарии, в которых вы можете использовать дерево выражений.

1) Dynamic Rule Engine - вместо жесткого кодирования логики правил в вашем коде. Вы можете построить свою логику бизнес-правил во время выполнения.

2) Динамические запросы Linq. Существуют различные сценарии, в которых разработчику необходимо писать жестко запрограммированные запросы. Таким образом, вы можете устранить это, используя дерево выражений.

0 голосов
/ 27 января 2012
public static void CreatingExpressionTree()
{
    ParameterExpression parameter1 = Expression.Parameter(typeof(int), "x");
    BinaryExpression multiply = Expression.Multiply(parameter1, parameter1);
    Expression<Func<int, int>> square = Expression.Lambda<Func<int, int>>(
        multiply, parameter1);
    Func<int, int> lambda = square.Compile();
    Console.WriteLine(lambda(5));
}
...