实体框架中的动态表名称linq

时间:2015-06-24 17:21:21

标签: asp.net-mvc linq entity-framework-6

我正在使用实体框架6和ASP.Net MVC 5.使用数据库上下文对象时,有没有办法为表名使用变量,而不必手动编写查询?

例如:

var tableName = "NameOfTable";

result = context.tableName.Find(...);

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

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

2 个答案:

答案 0 :(得分:2)

这是一个使用开关将特定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(...);

-OR -

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(...);

编辑:为实体框架修改

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

答案 1 :(得分:0)

除了上述有用的答案外,我还想添加此内容,以防其他人使用。

  • 如果您在Mark的答案中的“ 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 = sgrContext.Set(dynamicTableType);      // DbSet
    
         var records = dynamicTable
               .AsQueryable()
               .ToDynamicList()
               .OrderBy(d => d.MyColumnName)
               .Select(d => new { d.MyColumnName })
               .ToList();
    
          // do stuff
    }