From 7caabad6517b4e84849f71640033ab0dd1f79d41 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 28 Dec 2023 13:23:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=9F=E5=90=8D=E4=BF=AE=E6=94=B9=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=BD=91=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.API/appsettings.Event_IRC.json | 2 +- IRaCIS.Core.API/appsettings.Test_IRC.json | 2 +- IRaCIS.Core.API/appsettings.Uat_IRC.json | 2 +- IRaCIS.Core.Application/TestService.cs | 20 ++++--- .../Repository/DynamicRelationalExtensions.cs | 44 +++++++++++++- .../Repository/IRaCISContextExtension.cs | 57 ++++++------------- 6 files changed, 72 insertions(+), 55 deletions(-) diff --git a/IRaCIS.Core.API/appsettings.Event_IRC.json b/IRaCIS.Core.API/appsettings.Event_IRC.json index 6e3f5aa3a..43bdc06ee 100644 --- a/IRaCIS.Core.API/appsettings.Event_IRC.json +++ b/IRaCIS.Core.API/appsettings.Event_IRC.json @@ -50,7 +50,7 @@ "FromEmail": "uat@extimaging.com", "FromName": "UAT_IRC", "AuthorizationCode": "SHzyyl2021", - "SiteUrl": "http://uat.extimaging.com/login" + "SiteUrl": "http://irc.event.extimaging.com/login" } diff --git a/IRaCIS.Core.API/appsettings.Test_IRC.json b/IRaCIS.Core.API/appsettings.Test_IRC.json index 6d1b2efcb..edad727d5 100644 --- a/IRaCIS.Core.API/appsettings.Test_IRC.json +++ b/IRaCIS.Core.API/appsettings.Test_IRC.json @@ -59,7 +59,7 @@ "FromName": "Test_IRC", "AuthorizationCode": "SHzyyl2021", - "SiteUrl": "http://test.extimaging.com/login" + "SiteUrl": "http://irc.test.extimaging.com/login" } } diff --git a/IRaCIS.Core.API/appsettings.Uat_IRC.json b/IRaCIS.Core.API/appsettings.Uat_IRC.json index 2a2ec0e51..4bd7f8248 100644 --- a/IRaCIS.Core.API/appsettings.Uat_IRC.json +++ b/IRaCIS.Core.API/appsettings.Uat_IRC.json @@ -53,7 +53,7 @@ "FromEmail": "uat@extimaging.com", "FromName": "UAT_IRC", "AuthorizationCode": "SHzyyl2021", - "SiteUrl": "http://uat.extimaging.com/login" + "SiteUrl": "http://irc.uat.extimaging.com/login" } diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index d83be7e79..2bbe3f479 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -72,12 +72,12 @@ namespace IRaCIS.Application.Services /// [AllowAnonymous] [UnitOfWork] - public async Task OldLocalImageResizeJpg([FromServices] IOSSService oSSService, [FromServices] IRepository _repository, [FromServices] IWebHostEnvironment _hostEnvironment) + public async Task OldLocalImageResizeJpg([FromServices] IOSSService oSSService, [FromServices] IRepository _repository, [FromServices] IWebHostEnvironment _hostEnvironment) { var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment); - var studyList = _repository.Where(t => t.SeriesList.Any(t=>t.ImageResizePath.Length < 10)).Select(t => new { t.TrialId, t.SiteId, t.SubjectId, t.SubjectVisitId, t.Id }).ToList(); + var studyList = _repository.Where(t => t.SeriesList.Any(t => t.ImageResizePath.Length < 10)).Select(t => new { t.TrialId, t.SiteId, t.SubjectId, t.SubjectVisitId, t.Id }).ToList(); foreach (var studyitem in studyList) { @@ -104,7 +104,7 @@ namespace IRaCIS.Application.Services string fileName = summary.Key.Split('/').Last(); // 提取文件夹名 return new { - + Key = summary.Key, InstanceId = Guid.TryParse( fileName.Split('.')[0], @@ -116,11 +116,11 @@ namespace IRaCIS.Application.Services .Where(info => info.InstanceId != Guid.Empty) .ToList(); - foreach ( var jpg in jpgInfoList) + foreach (var jpg in jpgInfoList) { - var seriesId= _repository.Where(t=>t.Id==jpg.InstanceId).Select(t=>t.SeriesId).FirstOrDefault(); + var seriesId = _repository.Where(t => t.Id == jpg.InstanceId).Select(t => t.SeriesId).FirstOrDefault(); - await _repository.BatchUpdateAsync(t => t.Id == seriesId, t => new DicomSeries() { ImageResizePath ="/" +jpg.Key }); + await _repository.BatchUpdateAsync(t => t.Id == seriesId, t => new DicomSeries() { ImageResizePath = "/" + jpg.Key }); } // 设置 NextMarker 以获取下一页的数据 @@ -133,7 +133,7 @@ namespace IRaCIS.Application.Services Console.WriteLine($"Error: {ex.Message}"); } - await _repository.SaveChangesAsync(); + await _repository.SaveChangesAsync(); } @@ -146,9 +146,11 @@ namespace IRaCIS.Application.Services { - var aa= _dicRepository._dbContext.Subject.Where(t => t.Id == Guid.Empty).ExecuteUpdate("FirstName","ddd"); + //var aa= _dicRepository._dbContext.Subject.Where(t => t.Id == Guid.Empty).ExecuteUpdate("FirstName","ddd"); - await _repository.BatchUpdateAsync(t => t.Id == Guid.Empty, u => new Subject() { FirstName = "fddd", LastName = "sss" }); + await _repository.BatchUpdateAsync(t => t.Id == Guid.Empty, u => new Subject() { FirstName = "fddd", LastName = "sss", UpdateTime = DateTime.Now }); + + await _repository.Where().ExecuteUpdateAsync(t => t.SetProperty(t => t.UpdateTime, u => DateTime.Now)); return ResponseOutput.Ok(); } diff --git a/IRaCIS.Core.Infra.EFCore/Repository/DynamicRelationalExtensions.cs b/IRaCIS.Core.Infra.EFCore/Repository/DynamicRelationalExtensions.cs index 4eadf8408..b2ebb10f0 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/DynamicRelationalExtensions.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/DynamicRelationalExtensions.cs @@ -20,6 +20,8 @@ namespace IRaCIS.Core.Infra.EFCore static MethodInfo UpdateAsyncMethodInfo = typeof(RelationalQueryableExtensions).GetMethod(nameof(RelationalQueryableExtensions.ExecuteUpdateAsync)); + #region 避免使用 + public static int ExecuteUpdate(this IQueryable query, string fieldName, object? fieldValue) { var updateBody = BuildUpdateBody(query.ElementType, @@ -28,15 +30,53 @@ namespace IRaCIS.Core.Infra.EFCore return (int)UpdateMethodInfo.MakeGenericMethod(query.ElementType).Invoke(null, new object?[] { query, updateBody }); } - public static int ExecuteUpdate(this IQueryable query, IReadOnlyDictionary fieldValues) { var updateBody = BuildUpdateBody(query.ElementType, fieldValues); return (int)UpdateMethodInfo.MakeGenericMethod(query.ElementType).Invoke(null, new object?[] { query, updateBody }); } + public static Task ExecuteUpdateAsync(this IQueryable query, string fieldName, object? fieldValue, CancellationToken cancellationToken = default) + { + var updateBody = BuildUpdateBody(query.ElementType, + new Dictionary { { fieldName, fieldValue } }); + + return (Task)UpdateAsyncMethodInfo.MakeGenericMethod(query.ElementType).Invoke(null, new object?[] { query, updateBody, cancellationToken })!; + } + #endregion + + public static Dictionary ExtractFieldValues(this Expression> updateFactory) + { + var dic = new Dictionary(); + var obj = (TSource)Activator.CreateInstance(typeof(TSource)); + + Func func = updateFactory.Compile(); + + TSource applyObj = func(obj); + + var propList = ((MemberInitExpression)updateFactory.Body).Bindings.Select(mb => mb.Member.Name) + .Select(propName => typeof(TSource).GetProperty(propName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)).ToList(); + + + foreach (PropertyInfo prop in propList) + { + object value = prop.GetValue(applyObj); + dic.Add(prop.Name, value); + } + + return dic; + } + + + + public static Task ExecuteUpdateAsync(this IQueryable query, IReadOnlyDictionary fieldValues, CancellationToken cancellationToken = default) + { + var updateBody = BuildUpdateBody(query.ElementType, fieldValues); + + return (Task)UpdateAsyncMethodInfo.MakeGenericMethod(query.ElementType).Invoke(null, new object?[] { query, updateBody, cancellationToken })!; + } + - static LambdaExpression BuildUpdateBody(Type entityType, IReadOnlyDictionary fieldValues) { var setParam = Expression.Parameter(typeof(SetPropertyCalls<>).MakeGenericType(entityType), "s"); diff --git a/IRaCIS.Core.Infra.EFCore/Repository/IRaCISContextExtension.cs b/IRaCIS.Core.Infra.EFCore/Repository/IRaCISContextExtension.cs index 4e58ccad4..7adf79aa0 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/IRaCISContextExtension.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/IRaCISContextExtension.cs @@ -5,6 +5,7 @@ using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure.Extention; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query; +using SharpCompress.Factories; using System; using System.Collections.Generic; using System.Linq; @@ -170,7 +171,7 @@ namespace IRaCIS.Core.Infra.EFCore if (where == null) throw new ArgumentNullException(nameof(where)); - #region batch delete bug + #region history 使用扩展删除包,同时自动赋值更新人 更新时间 var bindings = ((MemberInitExpression)updateFactory.Body).Bindings.ToList(); @@ -205,62 +206,36 @@ namespace IRaCIS.Core.Infra.EFCore #endregion - #region efcore 7 - - //Dictionary propValues = new Dictionary(); - - //// 获取表达式体的 MemberInitExpression - //var memberInitExpr = (MemberInitExpression)updateFactory.Body; - - - - //// 获取初始化的绑定信息 - //var bindings = memberInitExpr.Bindings.ToList(); - - //var hasPropNameList = bindings.Select(t => t.Member.Name).ToList(); - - - //// 遍历绑定信息 - //foreach (MemberAssignment binding in bindings) + #region efcore 7 & 8 //{ - // // 获取属性名 - // string propName = binding.Member.Name; + // var fieldValues = updateFactory.ExtractFieldValues(); - // // 获取属性值,需要对表达式进行编译和调用 - // var propValue = Expression.Lambda(binding.Expression).Compile().DynamicInvoke(); + // var hasPropNameList = ((MemberInitExpression)updateFactory.Body).Bindings.Select(t => t.Member.Name).ToList(); - // // 现在,你可以访问属性名和属性值 - // propValues.Add(propName, propValue); - //} - - //if (typeof(IAuditUpdate).IsAssignableFrom(typeof(T))) - //{ - - // if (!hasPropNameList.Contains(nameof(IAuditUpdate.UpdateTime))) + // if (typeof(IAuditUpdate).IsAssignableFrom(typeof(T))) // { - // propValues.Add(nameof(IAuditUpdate.UpdateTime), DateTime.Now); + // if (!hasPropNameList.Contains(nameof(IAuditUpdate.UpdateTime))) + // { + // fieldValues.Add(nameof(IAuditUpdate.UpdateTime), DateTime.Now); + // } + // if (!hasPropNameList.Contains(nameof(IAuditUpdate.UpdateUserId))) + // { + // fieldValues.Add(nameof(IAuditUpdate.UpdateUserId), updateUserId); + // } // } - // if (!hasPropNameList.Contains(nameof(IAuditUpdate.UpdateUserId))) - // { - // propValues.Add(nameof(IAuditUpdate.UpdateUserId), updateUserId); - - // } - + // return await _dbContext.Set().IgnoreQueryFilters().Where(where).ExecuteUpdateAsync(fieldValues).ConfigureAwait(false) > 0; //} - //return await _dbContext.Set().IgnoreQueryFilters().Where(where).ExecuteUpdateAsync(s => s.SetProperty(t => "UpdateTime", u => "").se).ConfigureAwait(false) > 0; - - ////return await _dbContext.Set().IgnoreQueryFilters().Where(where).ExecuteUpdateAsync(propValues.SetProperties()).ConfigureAwait(false) > 0; #endregion } - + #endregion }