c# - 泛型和 Entity Framework : How do I return a different type depending on a column value

标签 c# entity-framework generics repository-pattern entity-framework-ctp5

我们有一个 Persons 表,其中存储了不同类型的人(买方、卖方、代理人等)。我们的 ORM 是 Entity Framework CodeFirst (CTP5)。我们正在使用存储库模式来实现良好的 TDD 和模拟。在 PersonRepository 中,我想返回一个特定的类型,这样我就可以做这样的事情:

Agent a = repository.Get<Agent>(5005);  // Where 5005 is just an example Id for the person
a.SomeAgentProperty = someValue;
Buyer b = repository.Get<Buyer>(253);   // Again, a simple PersonId.
b.SomeBuyerProperty = someOtherValue;

我的想法是,当我从存储库中获取它时,我知道我会得到什么样的人。而且,是的,我可以创建 X 个不同的 Get 方法,称为 GetBuyer(int PersonId)、GetSeller(int PersonId) 等等。但这有代码的味道。

通用函数看起来如何?

到目前为止,这是我的存储库界面:

public interface IPersonRepository
{
    Person Get(int PersonId);   // To get a generic person
    T Get<T>(int PersonId);     // To get a specific type of person (buyer, agent, etc.)
    void Save(Person person);
    void Delete(int p);
}

还有我的具体实现:

    public T Get<T>(int PersonId)
    {
        //Here's my question: What goes here?
    }

最佳答案

使用 OfType<T>()方法,如果您使用 TPT,这将导致 EF 对指定的 T 执行 INNER JOIN,或者如果您使用 TPH,则基于鉴别器的过滤器。

public TPerson Get<TPerson>(int PersonId) where TPerson : Person
{
    return ctx.People
              .OfType<TPerson>()
              .SingleOrDefault(x => x.PersonId == PersonId);
}

这将如您所愿:

Agent a = repository.Get<Agent>(5005);

关于c# - 泛型和 Entity Framework : How do I return a different type depending on a column value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4766450/

相关文章:

c# - WPF根据条件以编程方式更改行背景颜色

sql - 如何通过 Entity Framework 启用 SQL 应用程序角色

c# - Entity Framework - 代码优先 - 数据注释 - 不必要的外键列

c# - 编写泛型类来处理内置类型

swift - 通用加法函数 Swift

c# - 使用可以嵌入自身的正则表达式进行解析/拆分

c# - 在 WPF 中的某些情况下,上下文菜单被剪切

c# - 排序字符串数字

.net - 在 .NET 项目中引用程序集。奇怪的行为

java - Java 中的奇怪转换错误