我正在尝试使用动态表名执行一些LINQ
命令。例如,不是:
var o = (from x in context.users select x);
我想使用类似这样的东西:
var o = (from x in getTableObjectByName("users", context) select x);
多多少少。这是我目前为止编写的代码,它可以编译和运行:
using (MySiteEntities ipe2 = new MySiteEntities()) {
var propinfo1 = Type.GetType("MySiteNamespace.MySiteEntities").GetProperty("users");
var propval1 = propinfo1.GetValue(ipe2, null);
}
代码可以运行,但总是返回零条记录。用户表明确包含记录,而且无论如何,当我使用上述第一种方法直接调用它时,我会得到所有预期的记录。如何修改我的代码以实际拉下记录,而不仅仅是一个空集合?
编辑:我也尝试过这个:
using (MySiteEntities ipe = new MySiteEntities())
{
var prop = Type.GetType("MySiteNamespace.MySiteEntities").GetProperty("users");
Type dbsetType = typeof(DbSet<>);
dbsetType = dbsetType.MakeGenericType(Type.GetType("MySiteNamespace.user"));
Type t = dbsetType.GetType();
var val = prop.GetValue(ipe, null);
}
在这种情况下,代码不仅可以运行,而且实际上返回了预期的结果。然而,
val
是一个对象。我需要将其转换为类型DbSet<user>
,这应该很容易,但是参数user
只在运行时才知道...所以强制转换也需要是动态的。我尝试过使用Convert.ChangeType(val, t);
,但是这会抛出一个怎样才能将变量InvalidCastException (Object must implement IConvertible)。
val
转换为实际可用的对象呢?不确定这是否相关,但这是在EntityFramework 4上进行的。