【问题标题】:quick way to update in lambda expression在 lambda 表达式中更新的快速方法
【发布时间】:2015-09-09 16:21:06
【问题描述】:

这是我从数据库中获取数据并使用 lambda 表达式进行更新的方法。

 item _myItem = db.myDBContext.items.Where(x => x.id == 0).SingleOrDefault();
 _myItem.field1 = "myValueForField1";
 _myItem.field2 = "myValueForField2";
 _myItem.field3 = "myValueForField3";
 _myItem.field4 = "myValueForField4";
  db.myDBContext.SubmitChanges();

这只是一个示例,我的表格有很多列。
如果我按照这种方式,我必须分配每一列 (field1,field2,..)。
如果我有 20 列,我必须编写 20 行代码。
我可以动态分配字段名称吗?
喜欢

_myItem[dynamicFieldName] = ...;

或者有什么办法让它变得更好?
我只想动态分配字段名称。

【问题讨论】:

  • 带有field1...field2...fieldN 列的宽表本身就是一种反模式。您的表真的需要这样的结构吗?
  • 这只是一个简单的@Jamiec :),表有大约 10 个字段。我必须对其他表做同样的事情。
  • “如果我有 20 列,我必须写 20 行代码。” - 你没有,你有 10 列,你只需要 10 行代码。你打算花一个小时研究如何通过写 5 行来节省这 10 行,还是应该硬着头皮写 10 行?
  • 当然@Jamiec,我可以为我的dataFields写10行代码,但正如我所说,我必须更新其他表。
  • @Jamiec :我认为给定的字段名称只是一个例子。谁没有在 20 列的表格上工作过?

标签: c# lambda


【解决方案1】:

不使用反射,您不能以这种方式动态分配字段。

可以使用反射,但会影响性能。

例如:

var myField = "field1";
var field = _item.GetType().GetField(myField); // perhaps GetProperty() - depending on if its a field or a property.
field.SetValue(_item,"myValueForField1");

显然,这可以在一个循环中完成,将所有字段名称放在一个数组或某种列表中。

【讨论】:

    【解决方案2】:

    试试这个:

    item _myItem = db.myDBContext.items.Where(x => x.id == 0).SingleOrDefault();
    
    var typ = typeof(item);
    typ.GetProperties().ToList().Foreach(m=> m.SetValue(_myItem,"yourvalue", null));
    
    db.myDBContext.SubmitChanges();
    

    【讨论】:

      【解决方案3】:

      你可以使用反射:

      PropertyInfo pInfo = _myItem.GetType().GetProperty("field2"):
      pInfo.SetValue(_myItem, "myValueForField2");
      

      【讨论】:

        【解决方案4】:

        您不能使用反射。
        您将在您的 Item 类中创建索引器。并使用扩展方法转换为特定类型。

        using System;
        using System.Collections.Generic;
        namespace ConsoleApplication1
        {
            static class MyExtensions
            {
                public static int toInt32(this string field)
                {
                    return Convert.ToInt32(field);
                }
            }
            class MySpecificList
            {
                Dictionary<string, string> _fields = new Dictionary<string, string>();
                public string this[string name]
                {
                    get
                    {
                        return _fields[name];
                    }
                    set
                    {
                        _fields[name] = value;
                    }
                }
                static void Main(string[] args)
                {
                    MySpecificList list = new MySpecificList();
                    list["field1"] = "1";
                    Console.WriteLine(list["field1"].toInt32() + 1);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2022-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-25
          相关资源
          最近更新 更多