c#如何在运行更新查询后在列表中保留旧值



Net核心应用程序。我提出了以下问题。我正在尝试更新数据库表中的值。

public async Task<MyResponseModel> Update(RequestModel request)
{
IEnumerable<MyModel> mymodel = await _myRepository.GetAsync(x => Ids.Contains(x.Id));
List<MyModel> copy = new List<MyModel>();
copy.AddRange(mymodel)
for (int i = 0; i < mymodel.Count; i++)
{
//some property update
}
myRepository.UpdateRange(mymodel);
await _unitOfWork.CompleteAsync().ConfigureAwait(false);

这里的问题是在复制变量中的上述代码中,我想保留第一个查询直接返回的旧值。但问题是,在执行update命令后,即使我的复制变量值也会用更新后的新值进行更新。我想把旧的值保存在更新之前的副本列表中。有人能帮我找出它的根本原因吗?任何帮助都将不胜感激。感谢

快速解决方法获得两份模型副本:

public async Task<MyResponseModel> Update(RequestModel request)
{
var models = await _myRepository.GetAsync(x => Ids.Contains(x.Id));
var copyModels = await _myRepository.GetAsync(x => Ids.Contains(x.Id));
foreach (var model in models)
{
model.SomeProperty = "new value";
}
myRepository.UpdateRange(models);
await _unitOfWork.CompleteAsync().ConfigureAwait(false);
// copyModels still have old previous value
}

最初问题的根本原因是,将实例添加到新列表不会创建对象的副本,而是会创建对同一对象的引用的副本。

您可能想要使用Extensions方法:我在用户ajm的另一个问题中找到了这个答案。

static class Extensions
{
public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
{
return listToClone.Select(item => (T)item.Clone()).ToList();
}
}

copy.AddRange(mymodel(此代码将对mymodel进行浅层复制,因此";复制";变量将指向与"0"相同的存储位置中的数据;mymodel";变量要解决此问题,解决方法是用以下代码更新上面的代码行复制AddRange(JsonConvert.DescializeObject<List>(JsonConvert.SerializeObject(mymodel(((这也可以使用反射来完成,但以上是解决方法。

public async Task<MyResponseModel> Update(RequestModel request)
{
IEnumerable<MyModel> mymodel = await _myRepository.GetAsync(x => Ids.Contains(x.Id));
List<MyModel> copy = new List<MyModel>();
copy.AddRange(JsonConvert.DeserializeObject<List<MyModel>>(JsonConvert.SerializeObject(mymodel)))
for (int i = 0; i < mymodel.Count; i++)
{
//some property update
}
myRepository.UpdateRange(mymodel);
await _unitOfWork.CompleteAsync().ConfigureAwait(false);
}

最新更新