Есть ли лучший способ сделать обновления в LinqToSQL? - PullRequest
0 голосов
/ 18 марта 2010

У меня есть список (который приходит к моему приложению промежуточного программного обеспечения от клиента), который мне нужно поместить в мою базу данных. Некоторые элементы в списке уже могут быть в БД (просто нужно обновить). Другие новые вставки.

Оказывается, это намного сложнее, чем я думал. Вот мой код для этого. Я надеюсь, что есть лучший способ:

public void InsertClients(List<Client> clients)
{
    var comparer = new LambdaComparer<Client>((x, y) => x.Id == y.Id);

    // Get a listing of all the ones we will be updating
    var alreadyInDB = ctx.Clients
                         .Where(client => clients.Contains(client, comparer));

    // Update the changes for those already in the db
    foreach (Client clientDB in alreadyInDB)
    {
        var clientDBClosure = clientDB;
        Client clientParam = clients.Find(x => x.Id == clientDBClosure.Id);
        clientDB.ArrivalTime = clientParam.ArrivalTime;
        clientDB.ClientId = clientParam.ClientId;
        clientDB.ClientName = clientParam.ClientName;
        clientDB.ClientEventTime = clientParam.ClientEventTime;
        clientDB.EmployeeCount = clientParam.EmployeeCount;
        clientDB.ManagerId = clientParam.ManagerId;
    }

    // Get a list of all clients that are not in my the database.
    var notInDB = clients.Where(x => alreadyInDB.Contains(x, comparer) == false);

    ctx.Clients.InsertAllOnSubmit(notInDB);
    ctx.SubmitChanges();
}

Это кажется большой работой, чтобы сделать простое обновление. Но, может быть, я просто избалован.

В любом случае, если есть более простой способ сделать это, пожалуйста, дайте мне знать.


Примечание. Если вам интересно, код для LambdaComparer находится здесь: http://gist.github.com/335780#file_lambda_comparer.cs

Ответы [ 2 ]

3 голосов
/ 18 марта 2010
public void ProcessClients(List<Client> tempClients)
{
    foreach (Client client in tempClients)
    {
        Client originalClient = ctx.Clients.Where(a => a.Id == client.Id).SingleOrDefault();

        if (originalClient != null)
        {
            originalClient.ArrivalTime = client.ArrivalTime;
            originalClient.ClientId = client.ClientId;
            originalClient.ClientName = client.ClientName;
            originalClient.ClientEventTime = client.ClientEventTime;
            originalClient.EmployeeCount = client.EmployeeCount;
            originalClient.ManagerId = client.ManagerId;
        }
        else
        {
            ctx.Clients.InsertOnSubmit(client);
        }
    }

    ctx.SubmitChanges();
}
0 голосов
/ 18 марта 2010

не лучший способ, но альтернатива:

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