2010-12-08 5 views
1

LINQを使用してデータベースオブジェクトをアプリケーションに公開します。また、このアプリケーションでは、私のデータベースから 'foo'と呼ばれるオブジェクトを取得します。LINQでオブジェクトを別のオブジェクトに更新します。

public static Foo Get(int id) 
{ 
    MyDataContext db = new MyDataContext(); 
    Foo foo1 = (from f in db.Foos 
     where f.foo_id = id 
     select f).SingleOrDefault(); 
    return foo1; 
} 

ここで、fooを変更し、各フィールドを明示的に通過させずに更新したい場合は、これを避けたいと思います。

foo1.UpdateVales(foo); 

答えて

1

あなたが興味を持っているコピーすべてのプロパティ独自のクローニング法を作成またはあなたを

public static Foo Update(Foo foo) 
{ 
    MyDataContext db = new MyDataContext(); 
    Foo foo1 = (from f in db.Foos 
     where f.foo_id = foo.foo_id 
     select f).SingleOrDefault(); 

    if(foo1 != null) 
    { 
     foo1.foo_nm = foo.foo_nm; 
     ... 

     db.SubmitChanges(); 
    } 
} 

は、私は、エンティティフレームワークのような何かを行うことができます方法はあります。リフレクションを使用してすべてのパブリックプロパティを見つけ出し、それらをループすることができます。

ここではLINQは役に立ちません。あなたはおそらくあなたには、いくつかを置く必要がありますことがわかります

public static void GetDataFrom<T>(this T ObjToCopyTo, T ObjToCopyFrom) where T : class { 
     foreach (var property in ObjToCopyTo.GetType().GetProperties().Where(x => x.CanWrite)) 
      property.SetValue(ObjToCopyTo, property.GetValue(ObjToCopyFrom, null), null); 
    } 

1

はここにあなたが始めることができ非常にシンプル(とも非効率的な)拡張機能(あなたがSystem.ReflectionSystem.Linqをインポートしていることを確認してください)ですプライマリキーのような特殊なケースでは、すべてのプロパティを正確にコピーしたくないと判断するかもしれませんが、うまくいけば、これはVVSの答えの背景にあるアイデアを示しています。

あなたは次のスクリプトでこのアイデアで遊ぶことができますインストールされている場合linqpad

void Main() 
{ 
    var foo = new Helper.Foo() { 
     field1 = "hi", 
     field2 = 5, 
     field3 = 3.14, 
     field4 = 'm' 
    }; 
    var foo2 = new Helper.Foo(); 
    foo.Dump("Foo Before"); 
    foo2.Dump("Foo2 Before"); 
    foo2.GetDataFrom(foo); 
    foo.Dump("Foo After"); 
    foo2.Dump("Foo2 After"); 
} 

public static class Helper { 

    public class Foo { 
     public string field1 { get; set; } 
     public int field2 { get; set; } 
     public double field3 { get; set; } 
     public char field4 { get; set; } 
    } 

    public static void GetDataFrom<T>(this T ObjToCopyTo, T ObjToCopyFrom) where T : class { 
     foreach (var property in ObjToCopyTo.GetType().GetProperties().Where(x => x.CanWrite)) 
      property.SetValue(ObjToCopyTo, property.GetValue(ObjToCopyFrom, null), null); 
    } 

} 

を私はこれが役に立てば幸い!

1

私はautomapperを使用して、MVCモデルでDBを更新するのを避けるために重労働を避け、同じオブジェクト型へのマッピングに対応し、これらの種類のコーディングスタイルに便利です。 automapperをインストールした後

...

public ActionResult Example(TableModel model) 
{ 
    .. 
    Mapper.CreateMap<TableModel, Table>(); 
    Table myTable = new Table(); 
    Mapper.Map(model, myTable); 
    ... 
} 
関連する問題