基于EF8批量更新的扩展


public static class EFCoreExtensions
{
	public static int Update<TEntity>(this IQueryable<TEntity> query, TEntity entity)
	{
		if (query == null) { return 0; }
		if (entity == null) { return 0; }
		var methods = typeof(SetPropertyCalls<TEntity>).GetMethods().Where(x => x.Name.ToLower() == "SetProperty".ToLower());
		var setProperty = methods.FirstOrDefault();
		foreach (var method in methods)
		{
			var ps = method.GetParameters();
			if (ps.Length != 2)
			{
				continue;
			}
			if (ps[1].ParameterType.IsGenericType)
			{
				continue;
			}
			setProperty = method;
		}
		var entityExpression = Expression.Parameter(typeof(TEntity), "a");
		var setPropertyExpression = Expression.Parameter(typeof(SetPropertyCalls<TEntity>), "x");
		Expression call = setPropertyExpression;
		var setCount = 0;
		foreach (var p in typeof(TEntity).GetProperties())
		{
			var value = p.GetValue(entity);
			if (value == null)
			{
				continue;
			}
			if (value is DateTime && ((DateTime)value) == DateTime.MinValue)
			{
				continue;
			}
			setCount++;
			var propertyMethod = p.GetGetMethod();
			var propertyExpression = Expression.Lambda(Expression.Property(entityExpression, propertyMethod), new[] { entityExpression });
			call = Expression.Call(call,
			  setProperty.MakeGenericMethod(value.GetType()),
			  propertyExpression,
			  Expression.Constant(value));
		}
		if (setCount == 0) { return 0; }
		var lambda = Expression.Lambda<Func<SetPropertyCalls<TEntity>, SetPropertyCalls<TEntity>>>(call, setPropertyExpression);
		return RelationalQueryableExtensions.ExecuteUpdate(query, lambda);
	}
}

posted on   urmnur  阅读(91)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示