Entity Framework linq 中的动态表名

hic*_*cup 8 linq asp.net-mvc entity-framework-6

我将 Entity Framework 6 与 ASP.Net MVC 5 一起使用。当使用数据库上下文对象时,有没有办法为表名使用变量,而无需手动编写查询?

例如:

var tableName = "NameOfTable";

result = context.tableName.Find(...);
Run Code Online (Sandbox Code Playgroud)

我知道特定的代码不起作用,因为 tableName 没有在上下文中定义,但是有没有办法达到预期的效果?

这个网站上有一些类似的问题,但他们从来没有真正解决过这个问题,而且他们是针对早期版本的实体框架,所以我希望现在有一个答案。

小智 6

这是一个简单的解决方案,它使用开关将特定信息Type与表相关联。您还可以保持使用某种Dictionary<string, Type>对象。

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(...);
Run Code Online (Sandbox Code Playgroud)

-或者-

var tableName = "Table1";
Dictionary<string, Type> tableTypeDict = new Dictionary<string, Type>()
{
    { "Table1", Table1Type },
    { "Table2", Table2Type }
}; 
var query = context.Set(tableTypeDict[tableName]);
// Filter against "query" variable below...
var result = query.Where(...);
Run Code Online (Sandbox Code Playgroud)

编辑:为实体框架修改

EDIT2:typeof根据@thepirat000 的建议使用


nik*_*i b 6

除了上面有用的答案之外,我还想添加这个,以防对其他人有帮助。

  • 如果您在马克的回答中的“Where”子句中遇到此错误:

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

    安装 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 = dbContext.Set(dynamicTableType);      // DbSet
    
         var records = dynamicTable
               .AsQueryable()
               .ToDynamicList()
               .OrderBy(d => d.MyColumnName)
               .Select(d => new { d.MyColumnName })
               .ToList();
    
          // do stuff
    }
    
    Run Code Online (Sandbox Code Playgroud)