Дерево выражений для обычного кода - PullRequest
4 голосов
/ 12 мая 2010

Можно создать дерево выражений, если вы объявите его таковым.

Но возможно ли получить дерево выражений для обычного куска кода, такого как метод или метод получения свойства?

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

class Item : Entity
{
    [Cascade]
    public Document document { get; set; }
    public int line { get; set; }

    public Product product { get; set; }
    public string description { get; set; }
    public decimal qty { get; set; }
    public decimal price { get; set; }
    public decimal net
    {
        get
        {
            return qty * price;
        }
    }
    public VatCode vat_code { get; set; }
}

, где чистое значение равно qty * цене, поэтому я хотел бы объявить его как таковое, либо со свойством, либо с методом, а затем также иметь внутреннее представление о том, что выражение может генерировать соответствующий SQL для определения соответствующего вычисляемого значения. столбец в соответствующем представлении базы данных.

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

Если это невозможно, я полагаю, что рекомендуемым решением было бы объявить что-то вроде статического поля, являющегося деревом выражений, и скомпилировать / запустить его во время выполнения для внутреннего использования, а также для самоанализа как обычно для генерации SQL

Ответы [ 2 ]

1 голос
/ 12 мая 2010

Раньше я искал похожую вещь, и я не нашел идеального способа сделать это, ТБХ.

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

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

А как вставить выражение в обычный запрос linq? Я написал сообщение в блоге об этом. По сути, я создаю расширитель выражений, который обновит дерево выражений L2S пользовательским выражением :) Расширение селекторов LINQ с помощью пользовательских выражений

1 голос
/ 12 мая 2010

Нет, не возможно - обычный код - это байт-код, нет механизма для превращения этого в дерево выражений. Что вы можете сделать, это использовать отражение - но это в основном так.

...