更新通用存储库中多个属性中的多个记录

Update multiple records in multiple properties in Generic Repository

我创建了一个存储库项目,这将有助于我的其他项目。 我想添加一个新的 method 来更新多个属性中的多个记录,但我不知道该怎么做。

工作环境:

Entity framework core

.Net 5

我试过的: 我已经创建了一个 method 将更新许多记录 但只有一个 属性 如下所示

public void UpdateMany<TEntity>(Expression<Func<TEntity, bool>> filterExpression, Expression<Func<TEntity, object>> updateThe, object value) where TEntity : class
{
    // Get the records to be updated depending on the filter expression
    var recordsToBeUpdated = Context.Set<TEntity>().Where(filterExpression).ToList();

    // Update the selected records
    recordsToBeUpdated.ForEach(entity =>
                               { 
                                   entity.GetType().GetProperty(updateThe.GetPropertyAccess().Name)?.SetValue(entity, value);
                               });

}

请问如何使用表达式或任何其他解决方案更新多个属性中的多个记录?

为什么不直接使用Action?像这样

 public static void UpdateMany<TEntity>(Expression<Func<TEntity, bool>> filterExpression, Action<TEntity> setProperty) where TEntity : class
 {
     // Get the records to be updated depending on the filter expression
     var recordsToBeUpdated = Context.Set<TEntity>().Where(filterExpression).ToList();

     // Update the selected records
     recordsToBeUpdated.ForEach(setProperty);
 }

喜欢这样使用

UpdateMany<Entity>(e => e.Foo == "Bar", e => e.SomeProperty = someValue);

UpdateMany<Entity>(e => e.Foo == "Bar", e => 
{
    e.SomeProperty = someValue;
    e.SomeOtherProperty = xyz;
    ...
});

取决于您的代码结构。您可以创建一个简单的 classstructrecord 来映射 属性 名称和您要设置的相应值。

class PropertyMap {
    public string PropertyName {get;set;}
    public object PropertyValue {get;set;}
}

然后您可以创建要更改的属性及其对应值的列表

var map = new List<PropertyMap>{
    new PropertyMap {
       PropertyName = nameof(Your_Property1),
       PropertyValue = "Jon Snow"
    },
    new PropertyMap {
       PropertyName = nameof(Your_Property2),
       PropertyValue = 26
    }
}

然后只需重载您当前的方法即可接收此地图。

public void UpdateMany<TEntity>(Expression<Func<TEntity, bool>> filterExpression, List<PropertyMap> maps) where TEntity : class
{
    // Get the records to be updated depending on the filter expression
    var recordsToBeUpdated = Context.Set<TEntity>().Where(filterExpression).ToList();
    var value = recordsToBeUpdated.FirstOrDefault();
   if(value != null){
     var properties = value.GetType().GetProperties();
     foreach (var entity in recordsToBeUpdated){
       foreach(map in maps){
           properties.FirstOrDefault(x=>x.Name == map.PropertyName)?
                     .SetValue(entity, map.PropertyValue);
       }
     }
   }
}

如果您可以使用 Newtonsoft.Json,您可以使用 JSON.

的值填充要更新的条目
public void UpdateMany<TEntity>(Expression<Func<TEntity, bool>> filterExpression, object value) where TEntity : class
{
    // Get the records to be updated depending on the filter expression
    var recordsToBeUpdated = Context.Set<TEntity>().Where(filterExpression).ToList();

    // Create the patch JSON
    var patch = JsonConvert.SerializeObject(value);

    // Update the selected records
    recordsToBeUpdated.ForEach(entity =>
    {
        JsonConvert.PopulateObject(patch, entity);
    });
}