【问题标题】:Use a variable to call a method使用变量调用方法
【发布时间】:2019-12-23 18:42:38
【问题描述】:

我正在使用实体框架来操作数据库,我想知道是否可以使用变量来调用方法

我尝试过这种方式:

string name = "tableName";
db.[name].AddRange(dates.[name]);

但是没用

我想以这种方式调用一个方法,因为我要在不同的表中进行多次插入。我想使用一个包含所有表名称的数组或某个集合。

然后迭代集合

public ActionResult MetodoRecibe(Reporte datas)
{
   string name = "tableName";
   db.tableName.AddRange(datos.tableName);
   db.SaveChanges();
   return Json(datas, JsonRequestBehavior.AllowGet);
 }

我的变量数据是Json,结构如下:

datas{
nameTable1[],
nameTable2[],
nameTable3[],
.
.
.
.
nameTable13
}

我曾考虑使用switch case 作为最后的手段,但由于表的数量,我更愿意使用第一个选项。

【问题讨论】:

  • 如果您需要 AddRange() 功能并且不想使用传统循环,请尝试创建一个扩展方法 AddRange 来满足您的需求。
  • 您可以使用reflection。另一种方法是创建一个字典,允许您通过表名调用特定的委托。
  • EF6 在 .Conttext.tt 上说的

标签: c# asp.net entity-framework entity-framework-6


【解决方案1】:

您需要使用反射来执行此类操作。 尝试如下:

public ActionResult MetodoRecibe(Reporte datas)
{
  string name = "TableName"; // This has to be exact with EF entity name
  var type = ((IQueryable)efContext.GetType().GetProperty("TableName").GetValue(efContext)).ElementType;
  var dbSet = efContext.Set(type); 
  dbset.AddRange(dates.[name]);
  efContext.SaveChanges();
}

【讨论】:

  • 我尝试过这种方式,但它给了我下一个错误: System.InvalidCastException: 'Unable to cast object of type 'System.Data.Entity.DbSet1[Report.Models.ParosLinea]' to type 'System.Data.Entity.DbSet'.' code` public virtual DbSet ParosLineas { 得到;放;我尝试使用我的数据库或实体上下文的这种方法,这是给我错误的代码:code var dbset = (System.Data.Entity.DbSet)db.GetType().GetProperty("ParosLineas").GetValue (分贝);
  • @JohnatanDeLeon 这个异常呢?
  • 我找到了一个解决方案,我做了这样的事情:code var type = ((IQueryable)db.GetType().GetProperty(name).GetValue(db)) .ElementType; var dbSet = db.Set(type);
  • @JohnatanDeLeon 我正在根据您的评论更新答案。
【解决方案2】:

我不太了解您在做什么背后的想法,但我猜您想通过字符串调用方法。你可以通过反思来做到这一点。

类似

MethodInfo myFunc = GetType().GetMethod("MyMethodName");
myFunc.Invoke(this, <MyMethodName arguments>);

【讨论】:

    【解决方案3】:

    EF 核心的 DbContext 有一个 AddRange&lt;T&gt; 方法,而 EF6 没有。当然,添加一个或几个相当容易:

    class MyContext : DbContext
    {
        ...
        // In case your nameTable1[] arrays are of type object[]
        public void AddRange(params object[] data)
        {
            if (!data.Any()) return;
    
            var entityType = data[0].GetType();
            Set(entityType).AddRange(data);
        }
    
        public void AddRange<T>(params T[] data)
            where T : class
        {
            Set<T>().AddRange(data);
        }
    
        public void AddRange<T>(IEnumerable<T> data)
            where T : class
        {
            Set<T>().AddRange(data);
        }
    
    }
    

    【讨论】:

    • 对不起,我是一名初级开发人员,另外我有一点时间用 C# 编程,事实是我不明白你的回答,我真的很抱歉。你能解释一下我如何使用这些方法来制作这样的东西:code(myDbContext.[variableWithNameOfTable].where(x => x.foreignKey == someNumber).select(all)) 我可以在哪里使用实体核心我工作
    • 你可以使用第一种方法添加一个你不知道类型的对象的集合,也就是你声明myDbContext.[variableWithNameOfTable]...的结果。但是,我认为您迟早会知道最好放弃这种无类型的方法,但这超出了本问答的范围。
    • 您的建议是什么。我将对不同的表进行相同的查询; SELECT * FROM TABLE WHERE FOREIGN_KEY = ANY_NUMBER 我将对 table2、table3、table4 ............ table11 进行相同的查询,并在过程中构建一个像这样的 json datos{ table1[] , 表 2[], 表 3[], . . .表11[] }
    • 请在另一个问题中提问。在 cmets 中这样做太多了。当提出一个新问题时,一定要描绘出更大的图景:你想要在更广泛的意义上实现什么?如果您有工作代码并且愿意分享足够多的内容以获得体面的评论,也许Code Review 是提出这样一个问题的更好地方。
    • 我发了一个新帖子这是链接stackoverflow.com/questions/57662134/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多