我正在使用实体框架6和ASP.Net MVC 5.使用数据库上下文对象时,有没有办法为表名使用变量,而不必手动编写查询?
例如:
var tableName = "NameOfTable";
result = context.tableName.Find(...);
我知道特定的代码不起作用,因为tableName没有在上下文中定义,但有没有办法达到预期的效果?
在这个网站上有一些类似的问题,但它们从未真正解决过这个问题,而且它们都是早期版本的实体框架,所以我希望现在有一个答案。
答案 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
}