动态选择上下文属性?

时间:2014-08-28 00:41:33

标签: c# dynamic entity-framework-6

我想知道是否有一种方法可以动态地从上下文中重用我的代码来返回实体。例如,我使用以下内容接收所有记录:

    public List<AbandonCode> GetAbandonCodes()
    {
        List<AbandonCode> ab;
        using (DataWarehouseEntities context = new DataWarehouseEntities())
        {
            ab = (from a in context.AbandonCodes select a).ToList<AbandonCode>();
        }
        return ab;
    }

我希望做的是创建一个类似于此的辅助方法,但我无法弄清楚如何设置context.WhatIWantToGet和返回类型。它看起来与此类似:

    public List<????> GetAbandonCodes(Type t)
    {
        List<t> ab;
        using (DataWarehouseEntities context = new DataWarehouseEntities())
        {
            ab = (from a in context.???? select a).ToList<t>();
        }
        return ab;
    }

我想做的甚至可能吗?

1 个答案:

答案 0 :(得分:1)

这里有几个不同的选择。这是完全通用的使用Set&lt; T> EF上下文的方法:

public List<T> GetAbandonCodes<T>() where T : class
{
    List<T> ab;
    using (DataWarehouseEntities context = new DataWarehouseEntities())
    {
        ab = context.Set<T>().ToList();
    }
    return ab;
}

...你会这样称呼:

 var codes = GetAbandonCodes<AbandonCode>();

如果要传入Type对象,而不是调用泛型方法,则可以使用非泛型Set()。这有点棘手,因为你必须将结果转换为可用的东西:

    public static DbSet GetAbandonCodes(Type t)
    {
        DbSet ab;
        using (DataWarehouseEntities context = new DataWarehouseEntities ())
        {
            ab = context.Set(t);
        }
        return ab;
    }

然后您可以像这样使用它:

var codes = GetAbandonCodes(typeof(AbandonCode)).Cast<AbandonCode>().ToList();

我建议使用第一种方法,因为它更安全,更容易使用。