Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq中的动态表名_C#_Linq_Entity Framework_Reflection - Fatal编程技术网

C# linq中的动态表名

C# linq中的动态表名,c#,linq,entity-framework,reflection,C#,Linq,Entity Framework,Reflection,我试图使用动态表名执行一些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 propinf

我试图使用动态表名执行一些
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);
}
运行,但始终返回零记录。users表肯定包含记录,在任何情况下,当我使用上面的第一个方法直接调用它时,我都会得到预期的所有记录。我如何修改我的代码来真正地下拉记录,而不仅仅是一个空集合

编辑:我也尝试过:

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);
}
使用(MySiteEntities ipe=new MySiteEntities())
{
var prop=Type.GetType(“MySiteNamespace.MySiteEntities”).GetProperty(“用户”);
类型dbsetType=typeof(DbSet);
dbsetype=dbsetype.MakeGenericType(Type.GetType(“MySiteNamespace.user”);
类型t=dbsetType.GetType();
var val=prop.GetValue(ipe,null);
}
在这种情况下,代码不仅运行,而且实际返回预期的结果。但是,
val
是一个对象。我需要将其转换为类型
DbSet
,这将非常简单,除了参数
user
仅在运行时已知……转换还需要是动态的。我试过使用
Convert.ChangeType(val,t),但这会引发

InvalidCastException(对象必须实现IConvertible)

如何将
val
变量转换为实际可用的对象


不知道这是否相关,但这在EntityFramework 4上。

在DbContext类中,添加一个名为Set的方法,该方法返回:

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
}
使用(var db=new YourDataContext())
{
//由于您的数据库集不是泛型的,因此您不能使用:
//db.Set(“Namespace.EntityName”).AsQueryable()。其中(a=>a.HasSomeValue。。。
//您的查询也应该是基于字符串的。
//使用System.Linq.Dynamic nuget包/命名空间
var results=db.Set(“Namespace.EntityName”)
.AsQueryable()
。其中(“某些属性>@1和某些属性>@2”,aValue,另一个值);
//现在可以迭代对象的结果集合
}

有关System.Linq.Dynamic的详细信息,请参见

关于或如何?泛型类型在编译时已知。如果泛型时间在编译时不存在,则无法动态强制转换到泛型时间(在运行时),除非通过反射构建对象。