У меня есть класс сущность strucure как:Полиморфные (рамочный объект) запроса через выражения
public class Base
{
public int ID { get; set; }
}
public class Instance : Base
{
public int Prop1 { get; set; }
}
Я могу запросить это обычно так (IQueryable < Base>):
.Where(p => (p as Instance).Prop1 == 1)
Это прекрасно работает .... но мне это нужно в гибком выражении, поэтому я пробовал:
var param = Expression.Parameter(typeof(Base));
var property = typeof(Instance).GetProperty("Prop1");
var constant = Expression.Constant(1);
//NOT WORKING LIKE THIS
var convertedParam = Expression.Convert(param, typeof(Instance));
var memberAccess = Expression.MakeMemberAccess(convertedParam, property);
var equals = Expression.Equal(memberAccess, constant);
Это приводит к хорошая ошибка: Невозможно использовать тип «База» для ввода «Экземпляр». LINQ to Entities поддерживает только листинг EDM-примитивов или типов перечислений. Поэтому мне нужна версия выражения (p как экземпляр)
Что мне делать (мне нужно использовать выражения ...)?
Expression.TypeAs ...... DOH! –
'.Where (p => ((Instance) p) .Prop1 == 1)' также работает, поэтому при использовании Expression это эквивалент 'Expression.Convert'. Но странно, что 'Expression.Convert' не работает так, как вы сказали. Итак, если вы имеете в виду 'Expression.TypeAs' - это ответ, вы должны добавить простой ответ с некоторым кодом и пометить его для других ссылок в будущем. Это интересная проблема, я думаю. – Hopeless