我将逐个保存数据库中的用户首选项列表,我想在一次点击中保存。
此代码工作正常,但我正在寻找优化的方法。
最佳的优化方式是什么。
public void SavePreference(List<UserPreferences> userPreference, string tokenId, string clientIp, string endUserIp)
{
var tokenPersister = new TokenPersister();
var loginMemberId = tokenPersister.GetMemberId(tokenId, clientIp, endUserIp);
if (loginMemberId <= 0)
{
Audit.Add(AuditEventType.SaveUserPreference, Severity.High, loginMemberId, tokenId,
"SaveUserPreference Failed|InValid Session", clientIp, endUserIp);
throw new BusinessServiceException(ErrorType.InValidSession, "User Session has been Expired, please login again");
}
foreach (var userPreferences in userPreference)
{
var flag = -1;
var paramPreference = new DbParameter[6];
paramPreference[0] = DataAccess.ParameterFactory.Create("@memberId", DbType.Int32, userPreferences.MemberId);
paramPreference[1] = DataAccess.ParameterFactory.Create("@preferenceKey", DbType.String, userPreferences.Key);
paramPreference[2] = DataAccess.ParameterFactory.Create("@value", DbType.String, userPreferences.PreferenceValue);
paramPreference[3] = DataAccess.ParameterFactory.Create("@category", DbType.String, userPreferences.Category);
paramPreference[4] = DataAccess.ParameterFactory.Create("@itemTypeId", DbType.Int32, (int)userPreferences.ItemTypeId);
paramPreference[5] = DataAccess.ParameterFactory.Create("@flag", DbType.Int32, flag);
paramPreference[5].Direction = ParameterDirection.Output;
try
{
DataAccess.ExecuteNonQuery(SpNames.SavePreference, paramPreference);
flag = (int)paramPreference[5].Value;
Audit.Add(AuditEventType.SaveUserPreference, Severity.Low, loginMemberId, tokenId, "SaveUserPreferences: SavePreference Successfully",
clientIp, endUserIp);
if (flag == -1)
{
throw new BusinessServiceException(ErrorType.InvalidRequest, "Site name " + userPreferences.PreferenceValue + " already exists");
}
}
catch (Exception ex)
{
}
}
}
答案 0 :(得分:2)
使用表值参数(TVP)将整个列表作为单个参数一次发送。使用INSERT ... SELECT
语法插入所有这些内容。您可以在网上找到这方面的例子。这是一种常见的技术。
使用存储过程不会在这里获得任何性能。但请确保使用参数化SQL。