C# 动态访问实体框架DbSet
此代码用于将表实体名称传递给控制器中的方法:C# 动态访问实体框架DbSet,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,此代码用于将表实体名称传递给控制器中的方法: public JsonResult IsSubCategoryExist(string Name, int? ID, string ClassName) { //my code.. } ClassName是我需要从数据库中检索的表的名称。我的上下文定义: ApplicationDbContext db = new ApplicationDbContext(); 有人能帮我吗?提前谢谢 这似乎很有魅力。我在这里重复他的解决方案,以说
public JsonResult IsSubCategoryExist(string Name, int? ID, string ClassName)
{
//my code..
}
ClassName是我需要从数据库中检索的表的名称。我的上下文定义:
ApplicationDbContext db = new ApplicationDbContext();
有人能帮我吗?提前谢谢 这似乎很有魅力。我在这里重复他的解决方案,以说明如果实体是在另一个不是执行程序集的程序集中定义的,如何让程序集搜索实体类型
DbContext db;
var assemblyName = "MyProject.MyEntities";
var entityName = "FooEntity";
long theEntityId = 1337;
var assembly = AppDomain.CurrentDomain.GetAssemblies()
.SingleOrDefault(a => a.GetName().Name == assemblyName);
var entityType = assembly.GetTypes()
.FirstOrDefault(t => t.Name == entityName);
var dbSet = db.Set(entityType);
var singleEntry = dbSet.Find(theEntityId);
var allEntries = dbSet.ToArray();
这假定所有实体类都位于同一已知程序集中
DbContext db;
var assemblyName = "MyProject.MyEntities";
var entityName = "FooEntity";
long theEntityId = 1337;
var assembly = AppDomain.CurrentDomain.GetAssemblies()
.SingleOrDefault(a => a.GetName().Name == assemblyName);
var entityType = assembly.GetTypes()
.FirstOrDefault(t => t.Name == entityName);
var dbSet = db.Set(entityType);
var singleEntry = dbSet.Find(theEntityId);
var allEntries = dbSet.ToArray();
您可以执行以下操作:
public async Task<JsonResult> IsSubCategoryExist(string Name, int? ID, string ClassName)
{
var type = Assembly.GetExecutingAssembly()
.GetTypes()
.FirstOrDefault(t => t.Name == ClassName);
if (type != null)
{
DbSet dbSet = _dbContext.Set(type);
List<object> subCategories;
if(ID == null)
{
subCategories = await dbSet.Where("Name == @0", Name)
.Take(1).ToListAsync();
}
else
{
subCategories = await dbSet.Where("Name == @0 and Id != @1", Name,ID)
.Take(1).ToListAsync();
}
if(subCategories.Count > 0)
{
return Json(false,JsonRequestBehavior.AllowGet);
}
return Json(true,JsonRequestBehavior.AllowGet);
}
else
{
throw new Exception("Table name does not exist with the provided name");
}
}
注意:不要忘记安装System.Linq.Dynamic from和@adiga的可能副本-谢谢参考。在您的引用中,Type是已知的,并使用typeof关键字进行翻译。而在我的例子中,类型是未知的。这取决于类名。如果我使用这种方法,并假设我的代码中有1000个不同的类名字符串,我将不得不硬编码所有这1000个类名,以将它们转换为表。这正是我想要避免的。@RK你试过我的答案了吗?@TanvirArjel是的。我现在只能用类名了。我将它作为远程属性上的一个参数从模型类中传递给一个字符串值,但它是未定义的。我在这里展示了它的实现:在第行抛出错误:wait dbSet.WhereName==@0和ID=@1,Name,ID.ToListAsync;在浏览器中声明:运算符“==”与操作数类型“Int32”和“Object”不兼容。已完成。非常感谢。