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 的建议使用
除了上面有用的答案之外,我还想添加这个,以防对其他人有帮助。
如果您在马克的回答中的“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)
归档时间: |
|
查看次数: |
9638 次 |
最近记录: |