用于检索实体模型的通用方法

时间:2012-07-24 21:37:23

标签: c# entity-framework generics

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:3)

您使用的是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( );

答案 1 :(得分:1)

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

entities.Set<T>();

答案 2 :(得分:1)

如果您不喜欢使用Reflection,这是另一种选择:

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