在LINQ动态表名[复制]在LINQ动态表名[复制](Dynamic table name in l

2019-05-12 03:40发布

这个问题已经在这里有一个答案:

  • 查询使用实体框架,从动态创建的表中的数据 2回答
  • 在动态LINQ查询设置的表名 2个回答

我试图执行一些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);
}

在这种情况下,代码不仅运行,但实际上如预期返回结果。 然而, val是一个对象。 我需要将它转换为类型DbSet<user> ,这将是很容易的,所不同的是所述参数user是在运行时仅已知....铸造需要是动态的,以及。 我已经尝试使用Convert.ChangeType(val, t); ,但抛出

InvalidCastException的(对象必须实现IConvertible)。

我怎样才能转换val变量的实际可用对象?

不知道这是否是相关的,但是这是对的EntityFramework 4。

Answer 1:

在你的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
}

在System.Linq.Dynamic更多信息,可以发现这里



文章来源: Dynamic table name in linq [duplicate]