2017-04-24 56 views
0

我有,在C#中運行,該代碼的功能代碼:更新使用自定義值

遍歷用戶列表和更新表中的行。

UPDATE CustomerUser 
       SET 
        LoginName = @LoginName, 
        UserName = @UserName,  
        IsActive = @IsActive, 
        IsDeleted = @IsDeleted, 
        DeletedDate = @DeletedDate, 
        Modified = CURRENT_TIMESTAMP() 
       WHERE ID = @CustomerUserID; 

在c#代碼中,它然後做一些連接到LoginName和userName列。

我想用一個SQL語句替換那個慢的C#進程,它執行類似下面的操作。我對SQL有足夠的瞭解,認爲我所要求的可能會完全瘋狂,但直到你問的時候纔會知道。

UPDATE CustomerUser 
        SET 
         LoginName = select concat(login,uniqueid) from CustomerUser where id **this would be an ID that is in the IN() of parent query** 
         UserName = @UserName,  
         IsActive = @IsActive, 
         IsDeleted = @IsDeleted, 
         DeletedDate = @DeletedDate, 
         Modified = CURRENT_TIMESTAMP() 
        WHERE ID **IN(1,2,3,4, etc...)**; 
+0

請更新你用正確的數據樣本和預期的結果質疑 – scaisEdge

回答

1

您可以更改您的查詢,以除去SELECT子查詢,只是做:

UPDATE CustomerUser 
SET LoginName = CONCAT(LoginName, UserName) 
-- Other fields, etc.. 
WHERE ID **IN(1,2,3,4, etc...)**; 

如果你在C#我這樣做會建議使用實體框架而不是SQL查詢字符串。我只在SQL Server中使用它,但使用它與MySQL的信息在這裏討論:

Using MySQL with Entity Framework

有了實體,那麼您可以使用所有的ID列表更新爲寫一個函數實現這一點一個parmeter:

void UpdateCustomerUsers(ICollection<int> ids) 
{ 
using (var context = new MyDbContext()) 
{ 
    var customerUsers = context.CustomerUsers.Where(cu => ids.Contains(cu.ID)); 

    foreach (var cu in customerUsers) 
    { 
     cu.LoginName = cu.LoginName + cu.UserName; 
     cu.Modified = DateTime.Now; 
     // and so on... 
    } 

    context.SaveChanges(); 
} 
} 
+0

不知道Ÿ誰做這個開發者選擇生內嵌SQL,但是我想移動或剛剛更新的內聯SQL現在,整個過程已經預定要重寫,但性能現在需要改進。 – ChampChris

0

您可以使用更新加入

UPDATE CustomerUser as t1 
    INNER JOIN ( 
      id from CustomerUser WHERE ID IN(1,2,3,4, etc...) 
) t2 on t1.ID=t2.id 
    SET 
     LoginName = select concat(t1.login, t1.uniqueid) 
     UserName = @UserName,  
     IsActive = @IsActive, 
     IsDeleted = @IsDeleted, 
     DeletedDate = @DeletedDate, 
     Modified = CURRENT_TIMESTAMP()