簡體   English   中英

有沒有更好的方法可以在LinqToSQL中進行更新?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM