Создание динамических выражений C#C#

Место общения программистов C#
Ответить
Anonymous
 Создание динамических выражений C#

Сообщение Anonymous »

Я хотел бы получить свойство из базы данных динамически на основе выражений.
У меня есть список Expression, который просто указывает на различные типизированные свойства модели.

Код: Выделить всё

public class Employee: IEmployee {

public int Id { get; set; }
public string Name { get; set; }
public DateTime CreatedOn { get; set; }
}
У меня есть список выражений из этой модели, который выглядит так:

Код: Выделить всё

x => x.Name,
x => x.CreatedOn
Они сохраняются как Expression, что означает, что они являются внутренними по отношению к выражению, которое мы преобразуем

Код: Выделить всё

x => Convert(x.CreatedOn)
Что во многом эквивалентно

Код: Выделить всё

x => (object)x.CreatedOn
В структуре сущностей это не будет работать, поскольку для работы EF требуется EDM.PrimitiveType. Поэтому я удалил преобразование, чтобы выражение напрямую указывало на свойство. Посмотрите это, чтобы увидеть, как работает StripConvert.
Когда я удаляю преобразование, у меня остается необработанное выражение или лямбда-выражение, которое нельзя использовать из оператора выбора, например

Код: Выделить всё

protected Expression[] expressions;

foreach(var exp in expressions) {
var context = new DbEntites();
var rawExp = exp.StripConvert();
// This does not work since Select expects an explicit return type from the expression
var myVal = context.Employees.Select(rawExp).FirstOrDefault();
}
В конце концов, мне просто нужен объект, однако использование выражения для obj не работает, поскольку ef зависит от EDM.PrimitiveType.
Итак, как я могу извлечь данные из структуры сущности, используя выражение, не зная типа.
Примечание: Я, вероятно, смогу построить это, используя отражение, но мне бы хотелось этого избежать делаю что-то подобное. **

Подробнее здесь: https://stackoverflow.com/questions/784 ... n-building
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»