Asp.net mvc 实体框架linq中的动态表名

Asp.net mvc 实体框架linq中的动态表名,asp.net-mvc,linq,entity-framework-6,Asp.net Mvc,Linq,Entity Framework 6,我正在使用实体框架6和ASP.NETMVC5。在使用数据库上下文对象时,是否有一种方法可以使用变量作为表名,而不必手动编写查询 例如: var tableName = "NameOfTable"; result = context.tableName.Find(...); 我知道特定的代码不会起作用,因为tableName不是在上下文中定义的,但是有没有办法达到预期的效果 这个网站上也有一些类似的问题,但它们从来没有真正解决过这个问题,它们是针对entity framework的早期版本,所

我正在使用实体框架6和ASP.NETMVC5。在使用数据库上下文对象时,是否有一种方法可以使用变量作为表名,而不必手动编写查询

例如:

var tableName = "NameOfTable";

result = context.tableName.Find(...);
我知道特定的代码不会起作用,因为tableName不是在上下文中定义的,但是有没有办法达到预期的效果


这个网站上也有一些类似的问题,但它们从来没有真正解决过这个问题,它们是针对entity framework的早期版本,所以我希望现在有答案。

这里有一个简单的解决方案,使用开关将特定的
类型与表关联。您还可以使用某种
字典
对象

var tableName = "Table1";
// Get proper return type.
Type returnType;
switch(tableName) {
    case "Table1":
        returnType = typeof(Table1EntityType);
        break;
    case "Table2":
        returnType = typeof(Table2EntityType);
        break;
}
var query = context.Set(returnType);
// Filter against "query" variable below...
var result = query.Where(...);
-或-

var tableName=“Table1”;
Dictionary tableTypeDict=新字典()
{
{“Table1”,Table1Type},
{“Table2”,Table2Type}
}; 
var query=context.Set(tableTypeDict[tableName]);
//根据下面的“查询”变量进行筛选。。。
var result=query.Where(…);
编辑:为实体框架修改


编辑2:根据@thepirat000的建议使用
typeof
除了上面有用的答案之外,我还想补充一下,以防它对其他人有帮助

  • 如果您在Mark答案中的“Where”子句中遇到此错误:

    'DbSet不包含'Where'的定义,并且找不到可接受的扩展方法'Where'接受'DbSet'类型的参数

    安装Nuget软件包“System.Linq.Dynamic.Core”使错误消失

  • 如果需要从表中访问LINQ方法列名,可以编写如下代码:

    var tableName = "MyTableName"; 
    var tableClassNameSpace = "MyProject.Models.EntityModels";
    
    using (var dbContext = new MyEntities()) 
    {
         var tableClassName = $"{tableClassNameSpace}.{tableName}";
         var dynamicTableType = Type.GetType(tableClassName);      // Type
         var dynamicTable = sgrContext.Set(dynamicTableType);      // DbSet
    
         var records = dynamicTable
               .AsQueryable()
               .ToDynamicList()
               .OrderBy(d => d.MyColumnName)
               .Select(d => new { d.MyColumnName })
               .ToList();
    
          // do stuff
    }
    

我不知道这个问题的答案,但是为实体创建分部类并支持表名属性能解决您的问题吗?为什么要这样做?对于这种情况,我想不出一个有效的用例。也许你可以告诉我们你最终想要实现什么?我正在尝试优化我的代码。我有几行类似的代码,它们唯一的区别是表的名称。我希望能够将这一行放到函数中,并将表的名称作为参数传递给函数,所以您讨论的是泛型而不是动态表名。例如,您可以执行
context.Set().Find(…)
这是一个LINQ到SQL的上下文。我使用的是实体框架,所以我使用的是dbContext。我不知道ExecuteQuery的等效函数是什么。您应该执行
returnType=typeof(TablexEntityType)是否设置上下文。是否将整个表加载到内存?
var tableName = "MyTableName"; 
var tableClassNameSpace = "MyProject.Models.EntityModels";

using (var dbContext = new MyEntities()) 
{
     var tableClassName = $"{tableClassNameSpace}.{tableName}";
     var dynamicTableType = Type.GetType(tableClassName);      // Type
     var dynamicTable = sgrContext.Set(dynamicTableType);      // DbSet

     var records = dynamicTable
           .AsQueryable()
           .ToDynamicList()
           .OrderBy(d => d.MyColumnName)
           .Select(d => new { d.MyColumnName })
           .ToList();

      // do stuff
}