Эх сурвалжийг харах

!1233 将Dict特细中的缓存查询剥离,放到字典服务里面,提高代码的通用性
Merge pull request !1233 from ir0nmax/next

zuohuaijun 1 жил өмнө
parent
commit
c4bdf4a0da

+ 4 - 10
Admin.NET/Admin.NET.Core/Attribute/DictAttribute.cs

@@ -40,19 +40,13 @@ public class DictAttribute : ValidationAttribute, ITransient
         // 是否忽略空字符串
         if (AllowEmptyStrings && string.IsNullOrEmpty(valueAsString)) return ValidationResult.Success;
 
-        // 查询缓存中是否存在
-        var cacheServiceProvider = validationContext.GetRequiredService<SysCacheService>();
         var sysDictDataServiceProvider = validationContext.GetRequiredService<SysDictDataService>();
+        var dictDataList = sysDictDataServiceProvider.GetDataList(DictTypeCode).Result;
 
-        string cacheKey = $"{CacheConst.KeyDict}{DictTypeCode}";
-        var dictDataList = cacheServiceProvider.Get<HashSet<SysDictData>>(cacheKey);
-        if (dictDataList == null)
-        {
-            dictDataList = sysDictDataServiceProvider.GetDataList(DictTypeCode).Result.ToHashSet();
-            cacheServiceProvider.Set(cacheKey, dictDataList);
-        }
+        // 使用HashSet来提高查找效率
+        var dictCodes = new HashSet<string>(dictDataList.Select(u => u.Code));
 
-        if (!dictDataList.Select(u => u.Code).ToHashSet().Contains(valueAsString))
+        if (!dictCodes.Contains(valueAsString))
             return new ValidationResult($"提示:{ErrorMessage}|字典【{DictTypeCode}】不包含【{valueAsString}】!");
         else
             return ValidationResult.Success;

+ 11 - 5
Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs

@@ -173,11 +173,17 @@ public class SysDictDataService : IDynamicApiController, ITransient
     [DisplayName("根据字典类型编码获取字典值集合")]
     public async Task<List<SysDictData>> GetDataList(string code)
     {
-        return await _sysDictDataRep.Context.Queryable<SysDictType>()
-            .LeftJoin<SysDictData>((u, a) => u.Id == a.DictTypeId)
-            .Where((u, a) => u.Code == code && u.Status == StatusEnum.Enable && a.Status == StatusEnum.Enable)
-            .OrderBy((u, a) => new { a.OrderNo, a.Code })
-            .Select((u, a) => a).ToListAsync();
+        var dictDataList = _sysCacheService.Get<List<SysDictData>>($"{CacheConst.KeyDict}{code}");
+        if (dictDataList == null)
+        {
+            dictDataList = await _sysDictDataRep.Context.Queryable<SysDictType>()
+                .LeftJoin<SysDictData>((u, a) => u.Id == a.DictTypeId)
+                .Where((u, a) => u.Code == code && u.Status == StatusEnum.Enable && a.Status == StatusEnum.Enable)
+                .OrderBy((u, a) => new { a.OrderNo, a.Code })
+                .Select((u, a) => a).ToListAsync();
+            _sysCacheService.Set($"{CacheConst.KeyDict}{code}", dictDataList);
+        }
+        return dictDataList;
     }
 
     /// <summary>