【问题标题】:Generic Method for retrieving an entity model检索实体模型的通用方法
【发布时间】:2012-07-24 21:37:22
【问题描述】:

我正在尝试创建一个通用方法来检索实体模型。所以我正在尝试创建一个能够获取实体模型类型并返回该类型数据的方法。

这是我到目前为止所拥有的。

        public List<T> Generic<T>(List<T> users) where T : List<T>, new()
    {
        using (var entities = new TestDBEntities())
        {
            var enUsers = entities.Users; // How to replace this to make it generic?
            return enUsers.ToList();
        }
    }

谢谢!

【问题讨论】:

    标签: c# entity-framework generics


    【解决方案1】:

    您使用的是 4.1 或更高版本(具有 DbContext)吗?

    如果不是,或者实体是ObjectContext,可以通过Reflection找到ObjectSet,如下:

    var objectSet = entities.GetType( ).GetProperties( )
        .Where( p => p.PropertyType.IsGenericType 
             && p.PropertyType.GetGenericArguments( )[ 0 ].Name == typeof( T ).Name )
        .Select( p => p.GetValue( entities, null ) as ObjectSet<T> )
        .First( );
    return objectSet.ToList( );
    

    【讨论】:

    • 谢谢,这正是我所需要的。是的,我正在使用 DbContext 选项不适合我的 4.0 版。
    【解决方案2】:

    您可以通过 Set() 方法从 DbContext 请求实体。所以,在这种情况下,我认为你可以得到;

    entities.Set<T>();
    

    【讨论】:

    • 感谢您的提示,但我目前正在运行没有 DbContext 的 4.0 版。
    【解决方案3】:

    如果您不喜欢使用反射,这是一种替代方法:

    TestDBEntities 是一个分部类,因此您可以向其中添加类似这样的内容:

    private Dictionary<Type, ObjectQuery> m_ObjectSets;
    private Dictionary<Type, ObjectQuery> ObjectSets
    {
        get
        {
            if( m_ObjectSets == null )
            {
                m_ObjectSets = new Dictionary<Type, ObjectQuery>( );
                m_ObjectSets[ typeof( YourTypeA ) ] = YourObjectSetA;
                m_ObjectSets[ typeof( YourTypeB ) ] = YourObjectSetB;
                ...
            }
            return m_ObjectSets;
        }
    }
    

    然后

        public ObjectSet<T> GetObjectSet<T>( ) where T : class
        {
            return ( ObjectSet<T> ) ObjectSets[ typeof( T ) ];
        }
    

    然后你的调用类可以有

    return entities.GetObjectSet<T>( );
    

    【讨论】:

    • 这个值得一试,从长远来看比反射更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多