【问题标题】:asp.net Entity framework database insertion using loop through columns Using LINQasp.net 实体框架数据库插入使用循环列使用 LINQ
【发布时间】:2013-08-14 09:48:24
【问题描述】:

我有一个名为Variables 的表,其中有(Id ,AdId,Variable1,Variable2,Variable3,Variable4,Variable5,Variable6,Variable7,Variable8 ) ,我有一个List<string> a,其中包含许多字符串(可能是 1、3、6 或 8)。

我的问题是如何将列表中的这些字符串插入到变量表中?

这样的事我可以做

    Variables v=new Variables();
    v.AdId=2;

if(a.count()==1){

v.variable1=a[0];
}else if(a.count()==2){
v.variable1=a[0];
v.variable2=a[1]
}else if (//so on){}

但是

我想像这样更动态地做一些事情:

Variables v=new Variables();
    v.AdId=2;
    for(int i=0; i<a.count() ;i++)
    {
         //here list items to be inserted to (variable1,variable2.....variable8)
         //, depending on list size ,number of variables are inserted
    }

【问题讨论】:

    标签: c# asp.net linq-to-entities


    【解决方案1】:

    您可以使用Reflection 使用GetProperty 方法动态访问Variable 模型的属性。

            Variables v = new Variables();
            var a = new List<int>{ 1, 2, 3, 4, 5, 6 , 7};
            for (int i = 0; i < a.Count; i++)
            {
                String propertyName = "Variable" + i;
                Type myType = v.GetType();
                try
                {
                    myType.GetProperty(propertyName).SetValue(v, a[i].ToString());
                }
                catch (NullReferenceException nre)
                {
                    Console.WriteLine("Cannot Find Property");
                }
            }
    

    如您所见,我使用字符串 propertyName 访问对象的属性,因此您可以以访问您要修改的属性的方式操作该字符串。

    如果我们尝试访问的属性未在类/模型中定义,我最后使用了 try 和 catch 块。

    还要注意,反射可能是一个缓慢的解决方案。不过,您可以寻找方法来大幅提高其性能。

    谢谢。希望对您有所帮助。

    【讨论】:

    • WOOOOW,成功了! ,这正是我想要的,谢谢你的回答(你天才)
    • 但是@Andrei 为什么它很慢?
    • 我相信它很慢,因为反射检查元数据,如果你经常使用反射,它会比正常的属性分配慢。您可以查看此链接以帮助您了解权衡取舍 - stackoverflow.com/questions/771524/how-slow-is-reflection
    【解决方案2】:

    在使用 Linq to 实体时,您可以尝试以下示例。为了稍后添加 Column 值,您可以使用名为 CreateT 的工厂方法作为选项,其中 T 是 实体类。

    现在,由于您的 List&lt;string&gt; 可以有可变数量的项目,实体类没有动态方法来获取如下列:Variables.Columns[i]Variables["ColumnName"]。所以使用任何循环都是可行的,但您仍然需要检查从a[1]a[9] 的所有值。

    我假设List&lt;string&gt; a 按顺序包含值。即a[1] 包含列的相应值:AdId 等。

     NorthwindEntities db = new NorthwindEntities();
        Variables vrbl = Variables.CreateVariables(a[0]);// usually have atleast one value 
     if(!String.IsNullOrEmpty(a[1]))
        AdId = a[1]; 
     if(!String.IsNullOrEmpty(a[2]))
        Variable1= a[2]; // assign the corresponding values from List of strings 
     if(!String.IsNullOrEmpty(a[3]))
        Variable2= a[3];
     if(!String.IsNullOrEmpty(a[4])) 
        Variable3= a[4];
     if(!String.IsNullOrEmpty(a[5])) 
        Variable4= a[5];
     if(!String.IsNullOrEmpty(a[6]))
        Variable5= a[6];
     if(!String.IsNullOrEmpty(a[7])) 
        Variable6= a[7];
     if(!String.IsNullOrEmpty(a[8])) 
        Variable7= a[8];
     if(!String.IsNullOrEmpty(a[9])) 
        Variable8= a[9];
    
        db.Variables.AddObject(vrbl); 
        db.SaveChanges();
    

    【讨论】:

    • 是的,它是正确的,但有时我可能有 2 个列表项,有时 3 个,直到 8 个,如何处理这种情况,我必须采取所有可能性吗?或者有一些动态的东西,比如循环抛出表列!
    • EF 没有太多的动态选项,你可以查看我更新的答案
    【解决方案3】:

    试试这个。为了快速 rply.. 可能是肮脏的解决方案

    你可以使用 switch case 语句。

    Variables v=new Variables();
    v.AdId=2;
    for(int i=0; i<a.count() ;i++)
    {
    switch (a.count())
        { 
            case 0:
                v.Variable1 = a[i].ToString();
                break;
            case 1:
                v.Variable1 = a[i].ToString();
                v.Variable2 = a[i++].ToString();
             case 2:
                v.Variable1 = a[i].ToString();
                v.Variable2 = a[i++].ToString();
                v.Variable2 = a[i+2].ToString();
                break;
    
    and so on.....
    
        }
    }
    

    【讨论】:

    • 我想到了一些更动态的东西
    • 是的,你是对的,但是这次我把8种可能性都拿走了,有没有更短的方法??因为我非常需要这种技术
    • 这样我必须把8种可能性都拿走,有没有更短更动态的方法?
    【解决方案4】:

    你可以为你的变量类写indexer。但内部实现必须使用开关或反射来设置属性值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多