多态(实体框架)通过表达式查询

时间:2015-10-01 13:18:16

标签: entity-framework polymorphism expression

我有一个实体类结构,如:

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);

这导致一个很好的错误:无法转换类型' Base'输入'实例'。 LINQ to Entities仅支持转换EDM原语或枚举类型。所以我需要一个表达式版本(p作为实例)

我该怎么办(我需要使用表达式......)?

1 个答案:

答案 0 :(得分:0)

我使用Expression.TypeAs修复它。 TypeAs与(p作为Instance)相同。

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);