Asp.net mvc 实体框架linq中的动态表名
我正在使用实体框架6和ASP.NETMVC5。在使用数据库上下文对象时,是否有一种方法可以使用变量作为表名,而不必手动编写查询 例如: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的早期版本,所
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
}