在LINQ中用另一个对象更新一个对象

时间:2010-12-08 19:01:40

标签: linq linq-to-sql

我使用LINQ将数据库对象公开给我的应用程序。同样在这个应用程序中,我从我的数据库中得到一个名为'foo'的对象,就像这样。

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并希望更新它而不明确地通过每个字段 - 我想避免这种情况。

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();
    }
}

我有办法在实体框架中做点什么:

foo1.UpdateVales(foo);

3 个答案:

答案 0 :(得分:1)

创建您自己的克隆方法,复制您感兴趣的所有属性。

或者,您可以使用反射来查找所有公共属性并循环遍历它们。

LINQ在这里没有帮助。

答案 1 :(得分:1)

这是一个非常简单(也是低效)的扩展功能,可以帮助您入门(确保导入System.ReflectionSystem.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);
    }

你可能会发现你必须为主键之类的东西添加一些特殊情况,并且可能决定你不想完全复制每个属性,但希望这显示了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);
    }

}

我希望这有帮助!

答案 2 :(得分:1)

我使用automapper来避免繁重的工作来更新数据库与MVC模型,应该适用于映射到相同的对象类型,并为这些类型的编码样式派上用场。

安装后自动播放器......

public ActionResult Example(TableModel model)
{
    ..
    Mapper.CreateMap<TableModel, Table>();
    Table myTable = new Table();
    Mapper.Map(model, myTable);
    ...
}