通过表达式进行多态(entity framework)查询

Polymorphic (entity framework) query through expressions

我有一个实体 class 结构如下:

public class Base
{
    public int ID { get; set; }
}

public class Instance : Base 
{
    public int Prop1 { get; set; }
}

我可以正常查询(在 IQueryable 上):

.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' 转换为类型 'Instance'。 LINQ to Entities 仅支持转换 EDM 原语或枚举类型。所以我需要 (p as Instance)

的表达式版本

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

我使用 Expression.TypeAs 修复了它。 TypeAs 与 (p as 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);