linq 中的动态 table 名称
Dynamic table name in linq
我正在尝试使用动态 table 名称执行一些 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);
}
可以运行,但总是 returns 零条记录。用户 table 肯定包含记录,并且在任何情况下,当我使用上面的第一种方法直接调用它时,我都会按预期获得所有记录。我如何修改我的代码以实际拉取记录,而不仅仅是一个空集合?
编辑:我也试过这个:
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);
}
在这种情况下,代码不仅可以运行,而且实际上 returns 结果符合预期。但是,val
是一个对象。我需要将其转换为 DbSet<user>
类型,这很容易,除了参数 user
仅在运行时已知....转换也需要是动态的。我试过使用 Convert.ChangeType(val, t);
,但会抛出一个
InvalidCastException (Object must implement IConvertible).
如何将 val
变量转换为实际可用的对象?
不知道这是否相关,但这是在 EntityFramework 4.
在您的 DbContext class 中,添加一个名为 Set that returns:
的方法
public DbSet Set(string name)
{
// you may need to fill in the namespace of your context
return base.Set(Type.GetType(name));
}
你可以这样查询:
using (var db = new YourDataContext())
{
// Since your DbSet isn't generic, you can can't use this:
// db.Set("Namespace.EntityName").AsQueryable().Where(a=> a.HasSomeValue...
// Your queries should also be string based.
// Use the System.Linq.Dynamic nuget package/namespace
var results = db.Set("Namespace.EntityName")
.AsQueryable()
.Where("SomeProperty > @1 and SomeThing < @2", aValue, anotherValue);
// you can now iterate over the results collection of objects
}
可以找到有关 System.Linq.Dynamic 的更多信息 here
我正在尝试使用动态 table 名称执行一些 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);
}
可以运行,但总是 returns 零条记录。用户 table 肯定包含记录,并且在任何情况下,当我使用上面的第一种方法直接调用它时,我都会按预期获得所有记录。我如何修改我的代码以实际拉取记录,而不仅仅是一个空集合?
编辑:我也试过这个:
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);
}
在这种情况下,代码不仅可以运行,而且实际上 returns 结果符合预期。但是,val
是一个对象。我需要将其转换为 DbSet<user>
类型,这很容易,除了参数 user
仅在运行时已知....转换也需要是动态的。我试过使用 Convert.ChangeType(val, t);
,但会抛出一个
InvalidCastException (Object must implement IConvertible).
如何将 val
变量转换为实际可用的对象?
不知道这是否相关,但这是在 EntityFramework 4.
在您的 DbContext class 中,添加一个名为 Set that returns:
的方法public DbSet Set(string name)
{
// you may need to fill in the namespace of your context
return base.Set(Type.GetType(name));
}
你可以这样查询:
using (var db = new YourDataContext())
{
// Since your DbSet isn't generic, you can can't use this:
// db.Set("Namespace.EntityName").AsQueryable().Where(a=> a.HasSomeValue...
// Your queries should also be string based.
// Use the System.Linq.Dynamic nuget package/namespace
var results = db.Set("Namespace.EntityName")
.AsQueryable()
.Where("SomeProperty > @1 and SomeThing < @2", aValue, anotherValue);
// you can now iterate over the results collection of objects
}
可以找到有关 System.Linq.Dynamic 的更多信息 here