我得到了我想在运行时查询的实体的名称,所以我使用反射来调用SqlQuery<T>
:
Assembly assm = typeof(DataAccessLayer.MyContext).Assembly;
Type myType = assm.GetTypes().SingleOrDefault(type => type.Name.Equals("Clients"));
MethodInfo genericMethod = typeof(System.Data.Entity.Database).GetMethods()
.Where(method => method.Name == "SqlQuery" && method.IsGenericMethod ==
true).FirstOrDefault();
MethodInfo generic = genericMethod.MakeGenericMethod(myType);
所以这项工作很好我设置了我的参数 - object[] args = { SomeQuery, new object[] { } };
然后我调用它 - generic.Invoke(db.Database, args);
。
问题是当我试图获得实际记录时。我尝试将调用分配给这样的变量:
var records = generic.Invoke(db.Database, args);
但是记录是object
的类型,实际上records
的值是我传递的sql查询记录调用。 Visual Studio为我提供了加载结果的选项,但似乎只能手动完成。
然后我尝试使用动态像:
dynamic records = generic.Invoke(db.Database, args);
产生相同的结果,第一个records
保存我的sql查询的字符串表示,当我加载结果时,我得到记录作为动态代理,但这就是全部。它更好一点,因为我可以在foreach
上使用records
时类型是动态的,但我无法从{{1}获得的动态代理中获得任何内容}。
最后我尝试了这个:
foreach
希望这会给我一个类型为 Assembly assm = typeof(DataAccessLayer.BankAttachmentsEntities).Assembly;
Type myType = assm.GetTypes().SingleOrDefault(type => type.Name.Equals("Clients"));
var listType = typeof(List<>).MakeGenericType(myType);
var list = Activator.CreateInstance(listType);
的实例化变量,但似乎并非如此。它仍然被认为是对象,我无法使用List<Clients>
或其他自动加载结果的方法。
如何访问这样提取的记录?