动态选择上下文属性

本文关键字:属性 上下文 选择 动态 | 更新日期: 2023-09-27 18:19:48

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

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

我希望创建一个类似的helper方法,但我不知道如何设置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;
    }

我想做的事情有可能吗?

动态选择上下文属性

这里有几个不同的选项。以下是使用Set<EF上下文上的T>方法:

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();

不过,我还是推荐第一种方法,因为它更安全、更容易使用。