我是Entity Framework的新手,我对以下内容感到困惑。
我有一个已导入EDMX模型的现有数据库。
我的一些实体拥有相同的“所有者”概念。
每个实体都有“所有者”的自定义名称。有时它被命名为“作者”,有时被称为“所有者”,有时被称为法语“auteur”。
所以我已经实现了一个简单的接口并创建了部分类,因此我的实体可以共享相同的“所有者”命名概念。
public interface IAPIResource
{
int owner { get; }
}
我的实体BlogPost的部分课程
public partial class BlogPost : IAPIResource
{
public int owner { get { return auteur; } }
}
现在我想在LINQToEntities查询中使用它,但LINQ告诉我这是不可能的,因为IAPIResource不是实体类型!
public List<T> GetFilteredEntities<T>(int owner, IQueryable<T> entities, MyDBContext db)
{
return entities.Where(e => ((IAPIResource)e).owner == owner).ToList();
}
我尝试使用Reflection(.GetType
和.GetProperty
以及.GetValue
),但LINQ也不支持。
我也尝试过POCO,但没有太多运气。
我不想用抽象实体修改我的数据库模型等等。
有没有人有一个简单的解决方案而没有深入LINQ Expression?
注意:真正的查询要复杂得多,这就是我不愿意使用Expression的原因。
谢谢。
答案 0 :(得分:2)
实体框架不支持对IAPIResource
的显式转换,但您不需要它,您应该能够做到
public List<T> GetFilteredEntities<T>(int owner, IQueryable<T> entities, MyDBContext db)
where T : class, IAPIResource
{
return entities.Where(e => e.owner == owner).ToList();
}
但是,这确实要求您在实现类中映射owner
属性。你目前有
public int owner { get { return auteur; } }
但这不起作用,因为实体框架不会看到owner
和auteur
属于同一属性。你需要稍微改变一下;我个人的偏好是转过头来:让auteur
成为owner
的包装属性,而不是相反。这样,您就可以在代码中继续使用auteur
,在查询中继续使用owner
。