У меня есть список (который приходит к моему приложению промежуточного программного обеспечения от клиента), который мне нужно поместить в мою базу данных. Некоторые элементы в списке уже могут быть в БД (просто нужно обновить). Другие новые вставки.
Оказывается, это намного сложнее, чем я думал. Вот мой код для этого. Я надеюсь, что есть лучший способ:
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