循环遍历两个单个对象实体的字段

时间:2012-08-01 13:35:07

标签: asp.net-mvc entity-framework

[HttpPost]
public ActionResult Edit(orders neworders) 
{
    string modifields;
    orders oldorders = HDB.orders.Where(c => c.id_order == cmd.id_order).First();
    foreach (var field in oldorders)
    {
          if(field!= neworders.samefield)  
          {
              modifields+=nameoffield ;
         }            
    }
}

如何比较新记录和旧记录中的字段,如果更改了值,则保存字段名称?

4 个答案:

答案 0 :(得分:1)

Equals()方法的一个示例覆盖以比较同一个类的实例

  public override bool Equals(object anObject)
  {
     if (anObject is Order)
     {
        Order newOrder = (Order)anObject;
        if (newOrder.Name.Equals(this.Name)) //add additional comparisons as needed.  You could also use a foreach loop here as Tony shows below
        {
           return true;
        }
        foreach (var field in typeof(Order).GetFields())
        {
            if (field.GetValue(this) != field.GetValue(newOrder)) { return false; }
        }
        foreach (var property in typeof(Order).GetProperties())
        {
            if (property.GetValue(this, null) != property.GetValue(newOrder, null)) { return false; }
        }

     }
     return false;

  }

以下是如何致电您的行动:

[HttpPost] public ActionResult Edit(orders neworder)  
{     
    orders oldorder = HDB.orders.Where(c => c.id_order == cmd.id_order).First();     
    if(oldorder.Equals(newOrder)
    {
       //do wome work
    }
}

答案 1 :(得分:1)

First()返回单个对象,因此无法迭代。

在行之间进行读取,您希望迭代对象上的所有字段。在这种情况下,您可以使用反射返回可以迭代的字段列表。

foreach (var field in oldorders.GetType().GetFields())
{
    var value = field.GetValue(oldorders);
}

编辑:从您的其他评论中看起来您想要将该对象与另一个对象进行比较,在这种情况下,您最好实现IEquatable<T>接口。例如。

class Order : IEquatable<Order>
{
    // TODO: add properties of an Order
    public string foo { get; set; }
    public string bar { get; set; }

    public bool Equals(Order other)
    {
        foreach (var field in typeof(Order).GetFields())
        {
            if (field.GetValue(this) != field.GetValue(other))
            {
                return false;
            }
        }

        foreach (var property in typeof(Order).GetProperties())
        {
            if (property.GetValue(this, null) != property.GetValue(other, null))
            {
                return false;
            }
        }

        return true;
    }
}

答案 2 :(得分:0)

我会说你的orders类没有正确实现IEnumerable接口。为了以这种方式使用foreach,您必须实现该接口,并至少考虑支持它所需的所有方法。

http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

答案 3 :(得分:0)

您的订单变量不是可枚举的。 First()方法返回单个对象。删除.First(),你将拥有一个foreach循环可以使用的Enumerable对象