EF EntityObject动态属性访问

时间:2012-11-22 10:49:23

标签: c# entity-framework dynamic interface poco

我是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的原因。

谢谢。

1 个答案:

答案 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; } }

但这不起作用,因为实体框架不会看到ownerauteur属于同一属性。你需要稍微改变一下;我个人的偏好是转过头来:让auteur成为owner的包装属性,而不是相反。这样,您就可以在代码中继续使用auteur,在查询中继续使用owner