通过表达式进行多态(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);
我有一个实体 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);