Обновить один объект с другим в LINQ - PullRequest
1 голос
/ 08 декабря 2010

Я использую 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 ]

1 голос
/ 09 декабря 2010

Вот очень простая (и также неэффективная) функция расширения, которая поможет вам начать работу (убедитесь, что вы импортируете System.Reflection и System.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);
    }

}

Надеюсь, это поможет!

1 голос
/ 04 декабря 2013

Я использую automapper, чтобы избежать тяжелой работы по обновлению БД моделями MVC, должен работать для отображения на один и тот же тип объекта и пригодится для такого рода стилей кодирования.

После установки автомппера ...

public ActionResult Example(TableModel model)
{
    ..
    Mapper.CreateMap<TableModel, Table>();
    Table myTable = new Table();
    Mapper.Map(model, myTable);
    ...
}
1 голос
/ 08 декабря 2010

Создайте свой собственный метод клонирования, который копирует все интересующие вас свойства.

В качестве альтернативы вы можете использовать отражение, чтобы найти все открытые свойства и просмотреть их.

LINQ здесь не поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...