Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态访问实体框架DbSet_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

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”不兼容。已完成。非常感谢。