1
[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 ;
         }            
    }
}

Q新しいレコードと古いレコードのフィールドを比較し、値が変更された場合にフィールドの名前を保存するにはどうすればよいですか?

4

4 に答える 4

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;
    }
}
于 2012-08-01T13:52:55.567 に答える
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
    }
}
于 2012-08-01T13:51:27.890 に答える
0

あなたのクラスはインターフェースを適切ordersに実装していないと思います。IEnumerableこの方法で使用するforeachには、インターフェイスを実装し、少なくともそれをサポートするために必要なすべてのメソッドを考慮する必要があります。

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

于 2012-08-01T13:38:12.127 に答える
0

oldrders 変数は列挙可能ではありません。First() メソッドは単一のオブジェクトを返します。.First() を削除すると、 foreach ループで使用できる Enumerable オブジェクトが作成されます

于 2012-08-01T13:38:28.313 に答える