1

我是实体框架的新手,我坚持以下几点。

我有一个已导入 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();
}

我已经尝试过反射(.GetTypeand .GetPropertyand .GetValue),但 LINQ 也不支持。

我也尝试过 POCO,但运气不佳。

而且我不想用抽象实体等修改我的数据库模型。

有没有人有一个简单的解决方案而不深入研究 LINQ 表达式?

注意:真正的查询要复杂得多,这就是我不愿意使用表达式的原因。

谢谢你。

4

1 回答 1

2

Entity Framework does not support an explicit cast to IAPIResource, but you don't need it, you should be able to just do

public List<T> GetFilteredEntities<T>(int owner, IQueryable<T> entities, MyDBContext db)
    where T : class, IAPIResource
{
    return entities.Where(e => e.owner == owner).ToList();
}

However, this does require that you map your owner property in the implementing classes. You currently have

public int owner { get { return auteur; } }

but that won't work, because Entity Framework won't see that owner and auteur are the same property. You do need to change this slightly; my personal preference would be to turn this around: make auteur a wrapper property for owner instead of the other way around. That way, you can continue using auteur in your code, and owner in queries.

于 2012-11-22T10:52:59.210 回答