查询实体框架以获取动态类型列表

时间:2013-11-18 15:08:40

标签: c# entity-framework generics reflection

当查询给定类型的所有对象的实体框架时,你会做这样的事情:

List<MyDesiredObjects> = _myContext.MyDesiredObjects.ToList();

但是有没有办法可以创建一个函数来查询EF以查找给定类型的所有对象(如果类型是可变的)?我已经创建了这个函数,它至少可以编译:

private List<TEntity> GetFromEF<TEntity>() where TEntity : class
{
    MyDBEntities context = new UnityDBEntities(_entityConnection);

    IObjectContextAdapter adapter = (IObjectContextAdapter)context;
    System.Data.Objects.ObjectContext oContext = adapter.ObjectContext;

    return oContext.CreateObjectSet<TEntity>().ToList();
}

但是我很难看到我怎么称呼它,更别提实际从中提取数据了。使用反射,像这样(ucm.MappingType是一个Type):

MethodInfo method = typeof(BaseXmlReader).GetMethod("GetFromEF");
MethodInfo gMethod = method.MakeGenericMethod(  ucm.MappingType.GetType() );
var meh = gMethod.Invoke(null, null);

对象引用未设置为对象实例时失败。我甚至还没有分页我的名单。

任何其他方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

解决您的空MethodInfo method

问题

GetMethod只会搜索公众成员。您可以将方法更改为公开,或者包括非公开方法,如下所示:

MethodInfo method = typeof(BaseXmlReader)
                       .GetMethod("GetFromEF", 
                                  BindingFlags.Instance | BindingFlags.NonPublic);

另外,我假设您的GetFromEF方法位于名为BaseXmlReader的类上?如果没有,则需要用类名替换。

然后你可以像这样调用:

BaseXmlReader instance = new BaseXmlReader();
MethodInfo method = typeof(BaseXmlReader)
                       .GetMethod("GetFromEF", 
                                  BindingFlags.Instance | BindingFlags.NonPublic);
MethodInfo gMethod = method.MakeGenericMethod(typeof(ucm.MappingType));
var result = gMethod.Invoke(instance, null);

或者像这样从内部调用:

MethodInfo method = typeof(BaseXmlReader)
                       .GetMethod("GetFromEF", 
                                  BindingFlags.Instance | BindingFlags.NonPublic);
MethodInfo gMethod = method.MakeGenericMethod(typeof(ucm.MappingType));
var result = gMethod.Invoke(this, null);