2015-10-01 3 views
1

У меня есть класс сущность 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 как экземпляр)

Что мне делать (мне нужно использовать выражения ...)?

+0

Expression.TypeAs ...... DOH! –

+0

'.Where (p => ((Instance) p) .Prop1 == 1)' также работает, поэтому при использовании Expression это эквивалент 'Expression.Convert'. Но странно, что 'Expression.Convert' не работает так, как вы сказали. Итак, если вы имеете в виду 'Expression.TypeAs' - это ответ, вы должны добавить простой ответ с некоторым кодом и пометить его для других ссылок в будущем. Это интересная проблема, я думаю. – Hopeless

ответ

0

Я исправил его с помощью выражения Expression.TypeAs. TypeAs совпадает с (p как экземпляр).

var param = Expression.Parameter(typeof(Base)); 
var property = typeof(Instance).GetProperty("Prop1"); 
var constant = Expression.Constant(1); 

//WORKING LIKE THIS :) 
var convertedParam = Expression.TypeAs(param, typeof(Instance)); 

var memberAccess = Expression.MakeMemberAccess(convertedParam, property); 
var equals = Expression.Equal(memberAccess, constant); 

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

  • Нет связанных вопросов^_^