2012-01-11 2 views
4

Пред- полагая У меня есть следующий LambdaExpression:Могу ли я параметризовать имя свойства PropertyExpression, используя выражения LINQ?

И я хочу, чтобы имя свойства (второй параметр) в Expression.Property (...) завод, чтобы быть параметром, как я могу идти об этом?

Я надеялся увидеть конструктор, который выглядит, как это, но он не существует:

Expresssion.Property(Expression instance, Expression propName)

Есть ли какой-то трюк, я могу тянуть, что может конвертировать параметризованные ConstantExpression в нужной строке или MemberInfo? Возможно, я ошибаюсь.

Моя догадка заключается в том, что, поскольку эти деревья выражений при компиляции становятся легкими ИЛ, эта информация доступа к члену требуется, поэтому при создании деревьев выражений должны предоставляться имена членов и свойств.

Спасибо за любые советы!

EDIT: Требуется добавить, что это будет использоваться в качестве аргумента для метода расширения Enumerable.Where (...) для определения соответствия для отношения между двумя классами/сущностями.

+0

Что вы планируете делать с полученным выражением? Вы планируете отправить его в EF/LINQ2 , если это возможно? – dasblinkenlight

+0

Фактически, он используется для разрешения ссылки на сущность через определяемые пользователем ключи ... но в конечном итоге может быть использован поставщиком IQueryable, который у нас есть. :) –

+0

Perfect - в этом случае поставщик запросов может искать вашу вспомогательную функцию (см. Мой ответ ниже) и делать свою магию соответственно. Я предполагаю, что возможность поиска по свойству, идентифицируемому именем строки, встроена в ваш поставщик запросов. – dasblinkenlight

ответ

2

Деревья выражений представляют структуры IL, которые являются примерно того же вида, что и в ваших программах на C#/VB.NET. Вы не можете параметризовать, что выражение свойства по той же причине, что вы не можете «параметрирования» следующий код:

var x = new MyClass {Id = 1, Name = "hello"}; 
var propName = "Id"; 
var xId = x.propName; // <-- This will not compile 

Если вам нужно реализовать эту функциональность, и ваши деревья выражений не передается IQueryable<T>, вы можете написать помощника функция, принимающая объект и строку, и возвращающее значение свойства этого объекта, идентифицированного строкой; то вы можете использовать Expression.Call, чтобы вызвать эту вспомогательную функцию в дереве выражений, которое вы строите.

+0

Это заставляет меня думать в правильном направлении. Идея изменить доступ к ресурсу для вызова метода помощника представляется разумной. Я думаю, что я могу создать кеш-выражения, основанные на критериях, которые влияют на то, что имя свойства. В этом случае это ключевой поиск для типа. (Некоторые типы будут иметь разные или даже составные свойства для своего ключа). Итак, для данного типа я создам выражение, необходимое для сравнения. Кстати, это, в конце концов, заканчивается тем, что передается как аргумент Enumerable.Where (...) ext. метод. Благодаря!!! –

Смежные вопросы