[英]Is there a better way to do updates in LinqToSQL?
我有一個列表(從客戶端到我的中間件應用程序),需要將其放入數據庫中。 列表中的某些項目可能已經在數據庫中(只需要更新)。 其他是新插件。
事實證明,這比我想象的要難得多。 這是我的代碼。 我希望有更好的方法:
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
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();
}
不是更好的方法,而是替代方法:
ctx.AddtoClients(notInDB);
ctx.SaveChanges();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.