c# - linq中的动态表名

标签 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 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 上。

最佳答案

在您的 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 的更多信息 here

关于c# - linq中的动态表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28099435/

相关文章:

c# - 如何向 NHibernate queryover 添加按方向动态排序

c# - 访问 NavigationProperty 的关联详细信息

c# - Entity Framework 6 - 基类的继承和导航属性

c# - 当 linq2db 不知道如何转换给定的表达式,即 Split(char) 到 SQL 时,我如何告诉它如何转换?

c# - 发布版本中是否取消了数组边界检查?

c# - LINQ 中的 LEFT JOIN 到实体?

c# - 使用 linq 表达式的 params 数组

c# - 在 C# 中创建动态变量名称

c# - 当 XML 具有特定的根元素名称时,如何将 XML 文件正确读入集合中?

sql - 使用包含多个选项的 Entity Framework 查询