懒得勤快 пре 3 година
родитељ
комит
b72b8e0cb3
47 измењених фајлова са 319 додато и 1865 уклоњено
  1. 1 2
      src/Masuit.MyBlogs.Core/Controllers/AdvertisementController.cs
  2. 3 0
      src/Masuit.MyBlogs.Core/Controllers/CategoryController.cs
  3. 24 24
      src/Masuit.MyBlogs.Core/Controllers/HomeController.cs
  4. 8 4
      src/Masuit.MyBlogs.Core/Controllers/LinksController.cs
  5. 20 21
      src/Masuit.MyBlogs.Core/Controllers/LoginController.cs
  6. 2 2
      src/Masuit.MyBlogs.Core/Controllers/MenuController.cs
  7. 2 2
      src/Masuit.MyBlogs.Core/Controllers/MiscController.cs
  8. 3 4
      src/Masuit.MyBlogs.Core/Controllers/MsgController.cs
  9. 7 2
      src/Masuit.MyBlogs.Core/Controllers/NoticeController.cs
  10. 7 7
      src/Masuit.MyBlogs.Core/Controllers/PostController.cs
  11. 9 5
      src/Masuit.MyBlogs.Core/Controllers/SearchController.cs
  12. 2 2
      src/Masuit.MyBlogs.Core/Controllers/SeminarController.cs
  13. 4 0
      src/Masuit.MyBlogs.Core/Controllers/ShareController.cs
  14. 14 4
      src/Masuit.MyBlogs.Core/Controllers/SubscribeController.cs
  15. 5 3
      src/Masuit.MyBlogs.Core/Controllers/ValuesController.cs
  16. 18 337
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/BaseRepository.cs
  17. 4 15
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/CommentRepository.cs
  18. 8 243
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/Interface/IBaseRepository.cs
  19. 4 15
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/LeaveMessageRepository.cs
  20. 5 20
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/MenuRepository.cs
  21. 34 46
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/PostRepository.cs
  22. 5 59
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/QueryableExt.cs
  23. 61 290
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/Repositories.cs
  24. 11 23
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/SearchDetailsRepository.cs
  25. 6 2
      src/Masuit.MyBlogs.Core/Infrastructure/Services/AdvertisementService.cs
  26. 10 386
      src/Masuit.MyBlogs.Core/Infrastructure/Services/BaseService.cs
  27. 8 295
      src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/IBaseService.cs
  28. 3 25
      src/Masuit.MyBlogs.Core/Infrastructure/Services/PostService.cs
  29. 0 1
      src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.csproj
  30. 6 0
      src/Masuit.MyBlogs.Core/Program.cs
  31. 1 3
      src/Masuit.MyBlogs.Core/Startup.cs
  32. 5 5
      src/Masuit.MyBlogs.Core/Views/Home/Category.cshtml
  33. 2 1
      src/Masuit.MyBlogs.Core/Views/Home/Index.cshtml
  34. 1 1
      src/Masuit.MyBlogs.Core/Views/Links/Index.cshtml
  35. 1 1
      src/Masuit.MyBlogs.Core/Views/Links/Index_Admin.cshtml
  36. 2 2
      src/Masuit.MyBlogs.Core/Views/Shared/_Layout.cshtml
  37. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/analysis.js
  38. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/comment.js
  39. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/donate.js
  40. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/merge.js
  41. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/misc.js
  42. 2 2
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/msg.js
  43. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/notice.js
  44. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/partner.js
  45. 2 2
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/post.js
  46. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/seminar.js
  47. 1 1
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/users.js

+ 1 - 2
src/Masuit.MyBlogs.Core/Controllers/AdvertisementController.cs

@@ -1,6 +1,5 @@
 using AutoMapper.QueryableExtensions;
 using Collections.Pooled;
-using EFCoreSecondLevelCacheInterceptor;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
@@ -72,7 +71,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 where = where.And(p => Regex.IsMatch(p.Title + p.Description + p.Url, kw, RegexOptions.IgnoreCase));
             }
 
-            var list = AdsService.GetQuery(where).OrderByDescending(p => p.Status == Status.Available).ThenByDescending(a => a.Price).ThenByDescending(a => a.Id).ProjectTo<AdvertisementViewModel>(MapperConfig).NotCacheable().ToPagedList(page, size);
+            var list = AdsService.GetQuery(where).OrderByDescending(p => p.Status == Status.Available).ThenByDescending(a => a.Price).ThenByDescending(a => a.Id).ProjectTo<AdvertisementViewModel>(MapperConfig).ToPagedList(page, size);
             return Ok(list);
         }
 

+ 3 - 0
src/Masuit.MyBlogs.Core/Controllers/CategoryController.cs

@@ -10,6 +10,7 @@ using Masuit.Tools.AspNetCore.ModelBinder;
 using Masuit.Tools.Models;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -67,6 +68,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             cat.ParentId = cmd.ParentId;
             cat.Path = cmd.ParentId > 0 ? (CategoryService[cmd.ParentId.Value].Path + "," + cmd.ParentId).Trim(',') : SnowFlake.NewId;
             bool b = await CategoryService.SaveChangesAsync() > 0;
+            QueryCacheManager.ExpireType<Category>();
             return ResultData(null, b, b ? "分类修改成功!" : "分类修改失败!");
         }
 
@@ -80,6 +82,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Delete(int id, int cid = 1)
         {
             bool b = await CategoryService.Delete(id, cid);
+            QueryCacheManager.ExpireType<Category>();
             return ResultData(null, b, b ? "分类删除成功" : "分类删除失败");
         }
     }

+ 24 - 24
src/Masuit.MyBlogs.Core/Controllers/HomeController.cs

@@ -1,7 +1,6 @@
 using AngleSharp;
 using AutoMapper.QueryableExtensions;
 using Collections.Pooled;
-using EFCoreSecondLevelCacheInterceptor;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Infrastructure.Repository;
@@ -26,6 +25,7 @@ using System.Linq.Expressions;
 using System.Runtime.InteropServices;
 using System.Text;
 using System.Text.RegularExpressions;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers;
 
@@ -57,11 +57,11 @@ public class HomeController : BaseController
     public async Task<ActionResult> Index([FromServices] IFastShareService fastShareService)
     {
         var banners = AdsService.GetsByWeightedPrice(8, AdvertiseType.Banner, Request.Location()).OrderByRandom().ToList();
-        var fastShares = await fastShareService.GetAllFromCacheAsync(s => s.Sort);
+        var fastShares = fastShareService.GetAllFromCache(s => s.Sort);
         var postsQuery = PostService.GetQuery(PostBaseWhere()); //准备文章的查询
-        var posts = await postsQuery.Where(p => !p.IsFixedTop).OrderBy(OrderBy.ModifyDate.GetDisplay() + " desc").ToCachedPagedListAsync<Post, PostDto>(1, 15, MapperConfig);
-        posts.Data.InsertRange(0, postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate).ProjectTo<PostDto>(MapperConfig).Cacheable().ToList());
-        var viewModel = await GetIndexPageViewModel();
+        var posts = await postsQuery.Where(p => !p.IsFixedTop).OrderBy(OrderBy.ModifyDate.GetDisplay() + " desc").ToPagedListAsync<Post, PostDto>(1, 15, MapperConfig);
+        posts.Data.InsertRange(0, postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate).ProjectTo<PostDto>(MapperConfig).FromCache().ToList());
+        var viewModel = GetIndexPageViewModel();
         viewModel.Banner = banners;
         viewModel.Posts = posts;
         ViewBag.FastShare = fastShares;
@@ -88,13 +88,13 @@ public class HomeController : BaseController
     public async Task<ActionResult> Post([Optional] OrderBy? orderBy, int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
     {
         page = Math.Max(1, page);
-        var viewModel = await GetIndexPageViewModel();
+        var viewModel = GetIndexPageViewModel();
         var postsQuery = PostService.GetQuery(PostBaseWhere()); //准备文章的查询
         var h24 = DateTime.Today.AddDays(-1);
         var posts = orderBy switch
         {
-            OrderBy.Trending => await postsQuery.Where(p => !p.IsFixedTop).OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(t => t.Count)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
-            _ => await postsQuery.Where(p => !p.IsFixedTop).OrderBy((orderBy ?? OrderBy.ModifyDate).GetDisplay() + " desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
+            OrderBy.Trending => await postsQuery.Where(p => !p.IsFixedTop).OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(t => t.Count)).ToPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+            _ => await postsQuery.Where(p => !p.IsFixedTop).OrderBy((orderBy ?? OrderBy.ModifyDate).GetDisplay() + " desc").ToPagedListAsync<Post, PostDto>(page, size, MapperConfig)
         };
         if (page == 1)
         {
@@ -136,10 +136,10 @@ public class HomeController : BaseController
         var h24 = DateTime.Today.AddDays(-1);
         var posts = orderBy switch
         {
-            OrderBy.Trending => await queryable.OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
-            _ => await queryable.OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
+            OrderBy.Trending => await queryable.OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+            _ => await queryable.OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToPagedListAsync<Post, PostDto>(page, size, MapperConfig)
         };
-        var viewModel = await GetIndexPageViewModel();
+        var viewModel = GetIndexPageViewModel();
         ViewBag.Tag = tag;
         viewModel.Posts = posts;
         viewModel.PageParams = new Pagination(page, size, posts.TotalCount, orderBy);
@@ -182,10 +182,10 @@ public class HomeController : BaseController
         var h24 = DateTime.Today.AddDays(-1);
         var posts = orderBy switch
         {
-            OrderBy.Trending => await queryable.OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
-            _ => await queryable.OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
+            OrderBy.Trending => await queryable.OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+            _ => await queryable.OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToPagedListAsync<Post, PostDto>(page, size, MapperConfig)
         };
-        var viewModel = await GetIndexPageViewModel();
+        var viewModel = GetIndexPageViewModel();
         viewModel.Posts = posts;
         viewModel.PageParams = new Pagination(page, size, posts.TotalCount, orderBy);
         viewModel.SidebarAds = AdsService.GetsByWeightedPrice(2, AdvertiseType.SideBar, Request.Location());
@@ -215,10 +215,10 @@ public class HomeController : BaseController
         var h24 = DateTime.Today.AddDays(-1);
         var posts = orderBy switch
         {
-            OrderBy.Trending => await PostService.GetQuery(where).OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
-            _ => await PostService.GetQuery(where).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
+            OrderBy.Trending => await PostService.GetQuery(where).OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+            _ => await PostService.GetQuery(where).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToPagedListAsync<Post, PostDto>(page, size, MapperConfig)
         };
-        var viewModel = await GetIndexPageViewModel();
+        var viewModel = GetIndexPageViewModel();
         ViewBag.Author = author;
         viewModel.Posts = posts;
         viewModel.PageParams = new Pagination(page, size, posts.TotalCount, orderBy);
@@ -250,10 +250,10 @@ public class HomeController : BaseController
         var h24 = DateTime.Today.AddDays(-1);
         var posts = orderBy switch
         {
-            OrderBy.Trending => await PostService.GetQuery(PostBaseWhere().And(p => cids.Contains(p.CategoryId))).OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
-            _ => await PostService.GetQuery(PostBaseWhere().And(p => cids.Contains(p.CategoryId))).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
+            OrderBy.Trending => await PostService.GetQuery(PostBaseWhere().And(p => cids.Contains(p.CategoryId))).OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+            _ => await PostService.GetQuery(PostBaseWhere().And(p => cids.Contains(p.CategoryId))).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToPagedListAsync<Post, PostDto>(page, size, MapperConfig)
         };
-        var viewModel = await GetIndexPageViewModel();
+        var viewModel = GetIndexPageViewModel();
         viewModel.Posts = posts;
         ViewBag.Category = cat;
         viewModel.PageParams = new Pagination(page, size, posts.TotalCount, orderBy);
@@ -322,18 +322,18 @@ public class HomeController : BaseController
     /// 获取页面视图模型
     /// </summary>
     /// <returns></returns>
-    private async Task<HomePageViewModel> GetIndexPageViewModel()
+    private HomePageViewModel GetIndexPageViewModel()
     {
         var postsQuery = PostService.GetQuery<PostDto>(PostBaseWhere()); //准备文章的查询
-        var notices = await NoticeService.GetPagesFromCacheAsync<DateTime, NoticeDto>(1, 5, n => n.NoticeStatus == NoticeStatus.Normal, n => n.ModifyDate, false); //加载前5条公告
-        using var cats = CategoryService.GetQuery(c => c.Status == Status.Available && c.Post.Count > 0).Include(c => c.Parent).OrderBy(c => c.Name).ThenBy(c => c.Path).AsNoTracking().Cacheable().ToPooledList(); //加载分类目录
+        var notices = NoticeService.GetPagesFromCache<DateTime, NoticeDto>(1, 5, n => n.NoticeStatus == NoticeStatus.Normal, n => n.ModifyDate, false); //加载前5条公告
+        using var cats = CategoryService.GetQuery(c => c.Status == Status.Available && c.Post.Count > 0).Include(c => c.Parent).OrderBy(c => c.Name).ThenBy(c => c.Path).AsNoTracking().FromCache().ToPooledList(); //加载分类目录
         var hotSearches = RedisHelper.Get<PooledList<KeywordsRank>>("SearchRank:Week").AsNotNull().Take(10).ToPooledList(); //热词统计
         var hot5Post = postsQuery.OrderBy((new Random().Next() % 3) switch
         {
             1 => nameof(OrderBy.VoteUpCount),
             2 => nameof(OrderBy.AverageViewCount),
             _ => nameof(OrderBy.TotalViewCount)
-        } + " desc").Skip(0).Take(5).Cacheable().ToPooledList(); //热门文章
+        } + " desc").Skip(0).Take(5).FromCache().ToPooledList(); //热门文章
         var tagdic = PostService.GetTags().OrderByRandom().Take(20).ToDictionary(x => x.Key, x => Math.Min(x.Value + 12, 32)); //统计标签
         return new HomePageViewModel
         {

+ 8 - 4
src/Masuit.MyBlogs.Core/Controllers/LinksController.cs

@@ -1,5 +1,4 @@
-using EFCoreSecondLevelCacheInterceptor;
-using Masuit.MyBlogs.Core.Common;
+using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
@@ -8,6 +7,7 @@ using Masuit.Tools;
 using Masuit.Tools.AspNetCore.ModelBinder;
 using Microsoft.AspNetCore.Mvc;
 using System.Text;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -28,7 +28,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("links"), ResponseCache(Duration = 600, VaryByHeader = "Cookie")]
         public async Task<ActionResult> Index([FromServices] IWebHostEnvironment hostEnvironment)
         {
-            var list = await LinksService.GetQueryFromCacheAsync<bool, LinksDto>(l => l.Status == Status.Available, l => l.Recommend, false);
+            var list = LinksService.GetQueryFromCache<bool, LinksDto>(l => l.Status == Status.Available, l => l.Recommend, false);
             var html = await new FileInfo(Path.Combine(hostEnvironment.WebRootPath, "template", "links.html")).ShareReadWrite().ReadAllTextAsync(Encoding.UTF8);
             ViewBag.Html = ReplaceVariables(html);
             ViewBag.Ads = AdsService.GetByWeightedPrice(AdvertiseType.InPage, Request.Location());
@@ -91,6 +91,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 }
 
                 var b = LinksService.AddEntitySaved(link) != null;
+                QueryCacheManager.ExpireType<Links>();
                 return ResultData(null, b, b ? "添加成功!这可能有一定的延迟,如果没有看到您的链接,请稍等几分钟后刷新页面即可,如有疑问,请联系站长。" : "添加失败!这可能是由于网站服务器内部发生了错误,如有疑问,请联系站长。");
             });
         }
@@ -104,6 +105,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Save([FromBodyOrDefault] Links links)
         {
             bool b = await LinksService.AddOrUpdateSavedAsync(l => l.Id, links) > 0;
+            QueryCacheManager.ExpireType<Links>();
             return b ? ResultData(null, message: "添加成功!") : ResultData(null, false, "添加失败!");
         }
 
@@ -149,6 +151,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Delete(int id)
         {
             bool b = await LinksService.DeleteByIdAsync(id) > 0;
+            QueryCacheManager.ExpireType<Links>();
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
 
@@ -159,7 +162,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [MyAuthorize]
         public ActionResult Get()
         {
-            var list = LinksService.GetAll<LinksDto>().OrderBy(p => p.Status).ThenByDescending(p => p.Recommend).ThenByDescending(p => p.Id).NotCacheable().ToList();
+            var list = LinksService.GetAll<LinksDto>().OrderBy(p => p.Status).ThenByDescending(p => p.Recommend).ThenByDescending(p => p.Id).ToList();
             return ResultData(list);
         }
 
@@ -208,6 +211,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             {
                 Status = m.Status == Status.Unavailable ? Status.Available : Status.Unavailable
             }) > 0;
+            QueryCacheManager.ExpireType<Links>();
             return ResultData(null, b, b ? "切换成功!" : "切换失败!");
         }
     }

+ 20 - 21
src/Masuit.MyBlogs.Core/Controllers/LoginController.cs

@@ -2,31 +2,30 @@
 using Masuit.MyBlogs.Core.Models.ViewModel;
 using Microsoft.AspNetCore.Mvc;
 
-namespace Masuit.MyBlogs.Core.Controllers
+namespace Masuit.MyBlogs.Core.Controllers;
+
+[Route("login")]
+public class LoginController : AdminController
 {
-    [Route("login")]
-    public class LoginController : AdminController
-    {
-        public ILoginRecordService LoginRecordService { get; set; }
+    public ILoginRecordService LoginRecordService { get; set; }
 
-        [Route("delete/{id:int}/{ids}")]
-        public async Task<ActionResult> Delete(int id, string ids)
+    [Route("delete/{id:int}/{ids}")]
+    public async Task<ActionResult> Delete(int id, string ids)
+    {
+        if (!string.IsNullOrWhiteSpace(ids))
         {
-            if (!string.IsNullOrWhiteSpace(ids))
-            {
-                bool b = await LoginRecordService.DeleteEntitySavedAsync(r => r.UserInfoId == id && ids.Contains(r.Id.ToString())) > 0;
-                return ResultData(null, b, b ? "删除成功!" : "删除失败");
-            }
-
-            return ResultData(null, false, "数据不合法");
+            bool b = await LoginRecordService.DeleteEntitySavedAsync(r => r.UserInfoId == id && ids.Contains(r.Id.ToString())) > 0;
+            return ResultData(null, b, b ? "删除成功!" : "删除失败");
         }
 
-        [Route("getrecent/{id:int}")]
-        public async Task<ActionResult> GetRecentRecord(int id)
-        {
-            var time = DateTime.Now.AddMonths(-1);
-            var list = await LoginRecordService.GetQueryFromCacheAsync<DateTime, LoginRecordViewModel>(r => r.UserInfoId == id && r.LoginTime >= time, r => r.LoginTime, false);
-            return ResultData(list);
-        }
+        return ResultData(null, false, "数据不合法");
+    }
+
+    [Route("getrecent/{id:int}")]
+    public ActionResult GetRecentRecord(int id)
+    {
+        var time = DateTime.Now.AddMonths(-1);
+        var list = LoginRecordService.GetQueryFromCache<DateTime, LoginRecordViewModel>(r => r.UserInfoId == id && r.LoginTime >= time, r => r.LoginTime, false);
+        return ResultData(list);
     }
 }

+ 2 - 2
src/Masuit.MyBlogs.Core/Controllers/MenuController.cs

@@ -1,5 +1,4 @@
 using Collections.Pooled;
-using DocumentFormat.OpenXml.Office.Word;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.Command;
@@ -10,7 +9,7 @@ using Masuit.Tools.AspNetCore.ModelBinder;
 using Masuit.Tools.Models;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc;
-using Microsoft.Graph;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -89,6 +88,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             Mapper.Map(model, m);
             m.Path = model.ParentId > 0 ? (MenuService[model.ParentId.Value].Path + "," + model.ParentId).Trim(',') : SnowFlake.NewId;
             bool b = await MenuService.SaveChangesAsync() > 0;
+            QueryCacheManager.ExpireType<Menu>();
             return ResultData(null, b, b ? "修改成功" : "修改失败");
         }
     }

+ 2 - 2
src/Masuit.MyBlogs.Core/Controllers/MiscController.cs

@@ -68,11 +68,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="size"></param>
         /// <returns></returns>
         [Route("donatelist")]
-        public async Task<ActionResult> DonateList([FromServices] IDonateService donateService, int page = 1, int size = 10)
+        public ActionResult DonateList([FromServices] IDonateService donateService, int page = 1, int size = 10)
         {
             if (bool.Parse(CommonHelper.SystemSettings.GetOrAdd("EnableDonate", "true")))
             {
-                var list = await donateService.GetPagesFromCacheAsync<DateTime, DonateDto>(page, size, d => true, d => d.DonateTime, false);
+                var list = donateService.GetPagesFromCache<DateTime, DonateDto>(page, size, d => true, d => d.DonateTime, false);
                 if (!CurrentUser.IsAdmin)
                 {
                     foreach (var item in list.Data.Where(item => !(item.QQorWechat + item.Email).Contains("匿名")))

+ 3 - 4
src/Masuit.MyBlogs.Core/Controllers/MsgController.cs

@@ -1,5 +1,5 @@
 using CacheManager.Core;
-using EFCoreSecondLevelCacheInterceptor;
+using Collections.Pooled;
 using Hangfire;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Common.Mails;
@@ -16,14 +16,13 @@ using Masuit.Tools.Html;
 using Masuit.Tools.Logging;
 using Masuit.Tools.Models;
 using Masuit.Tools.Strings;
+using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Net.Http.Headers;
 using System.ComponentModel.DataAnnotations;
 using System.Text;
 using System.Text.RegularExpressions;
-using Masuit.Tools.Systems;
 using SameSiteMode = Microsoft.AspNetCore.Http.SameSiteMode;
-using Collections.Pooled;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -377,7 +376,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [MyAuthorize]
         public ActionResult GetUnreadMsgs()
         {
-            var msgs = MessageService.GetQueryNoTracking(m => !m.Read, m => m.Time, false).NotCacheable().ToList();
+            var msgs = MessageService.GetQueryNoTracking(m => !m.Read, m => m.Time, false).ToList();
             return ResultData(msgs);
         }
 

+ 7 - 2
src/Masuit.MyBlogs.Core/Controllers/NoticeController.cs

@@ -10,6 +10,7 @@ using Masuit.Tools.AspNetCore.ModelBinder;
 using Masuit.Tools.Core.Net;
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -32,9 +33,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="size"></param>
         /// <returns></returns>
         [Route("notice"), Route("n", Order = 1), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "page", "size" }, VaryByHeader = "Cookie")]
-        public async Task<ActionResult> Index([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
+        public ActionResult Index([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
-            var list = await NoticeService.GetPagesFromCacheAsync<DateTime, NoticeDto>(page, size, n => n.NoticeStatus == NoticeStatus.Normal, n => n.ModifyDate, false);
+            var list = NoticeService.GetPagesFromCache<DateTime, NoticeDto>(page, size, n => n.NoticeStatus == NoticeStatus.Normal, n => n.ModifyDate, false);
             ViewData["page"] = new Pagination(page, size, list.TotalCount);
             foreach (var n in list.Data)
             {
@@ -91,6 +92,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             }
 
             var e = NoticeService.AddEntitySaved(notice);
+            QueryCacheManager.ExpireType<Notice>();
             return e != null ? ResultData(null, message: "发布成功") : ResultData(null, false, "发布失败");
         }
 
@@ -103,6 +105,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Delete(int id)
         {
             bool b = await NoticeService.DeleteByIdAsync(id) > 0;
+            QueryCacheManager.ExpireType<Notice>();
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }
 
@@ -117,6 +120,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             var notice = await NoticeService.GetByIdAsync(id) ?? throw new NotFoundException("公告未找到");
             notice.NoticeStatus = notice.NoticeStatus == NoticeStatus.Normal ? NoticeStatus.Expired : NoticeStatus.Normal;
             var b = await NoticeService.SaveChangesAsync() > 0;
+            QueryCacheManager.ExpireType<Notice>();
             return ResultData(null, b, notice.NoticeStatus == NoticeStatus.Normal ? $"【{notice.Title}】已上架!" : $"【{notice.Title}】已下架!");
         }
 
@@ -145,6 +149,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             entity.Title = notice.Title;
             entity.Content = await ImagebedClient.ReplaceImgSrc(await notice.Content.ClearImgAttributes(), cancellationToken);
             bool b = await NoticeService.SaveChangesAsync() > 0;
+            QueryCacheManager.ExpireType<Notice>();
             return ResultData(null, b, b ? "修改成功" : "修改失败");
         }
 

+ 7 - 7
src/Masuit.MyBlogs.Core/Controllers/PostController.cs

@@ -1,6 +1,5 @@
 using CacheManager.Core;
 using Collections.Pooled;
-using EFCoreSecondLevelCacheInterceptor;
 using Hangfire;
 using JiebaNet.Segmenter;
 using Masuit.LuceneEFCore.SearchEngine.Interfaces;
@@ -43,6 +42,7 @@ using System.Net;
 using System.Text;
 using System.Text.RegularExpressions;
 using System.Web;
+using Z.EntityFramework.Plus;
 using SameSiteMode = Microsoft.AspNetCore.Http.SameSiteMode;
 
 namespace Masuit.MyBlogs.Core.Controllers
@@ -117,7 +117,7 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             var regex = SearchEngine.LuceneIndexSearcher.CutKeywords(string.IsNullOrWhiteSpace(post.Keyword + post.Label) ? post.Title : post.Keyword + post.Label).Select(Regex.Escape).Join("|");
             ViewBag.Ads = AdsService.GetByWeightedPrice(AdvertiseType.InPage, Request.Location(), post.CategoryId, regex);
-            var related = await PostService.GetQuery(PostBaseWhere().And(p => p.Id != id && Regex.IsMatch(p.Title + (p.Keyword ?? "") + (p.Label ?? ""), regex, RegexOptions.IgnoreCase)), p => p.AverageViewCount, false).Take(10).Select(p => new { p.Id, p.Title }).Cacheable().ToDictionaryAsync(p => p.Id, p => p.Title);
+            var related = PostService.GetQuery(PostBaseWhere().And(p => p.Id != id && Regex.IsMatch(p.Title + (p.Keyword ?? "") + (p.Label ?? ""), regex, RegexOptions.IgnoreCase)), p => p.AverageViewCount, false).Take(10).Select(p => new { p.Id, p.Title }).FromCache().ToDictionary(p => p.Id, p => p.Title);
             ViewBag.Related = related;
             post.ModifyDate = post.ModifyDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
             post.PostDate = post.PostDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
@@ -639,7 +639,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [MyAuthorize]
-        public async Task<ActionResult> GetPageData([FromServices] ICacheManager<HashSet<string>> cacheManager, int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")] int size = 10, OrderBy orderby = OrderBy.ModifyDate, string kw = "", int? cid = null)
+        public async Task<ActionResult> GetPageData([FromServices] ICacheManager<HashSet<string>> cacheManager, int page = 1, [Range(1, 200, ErrorMessage = "页大小必须介于{1}-{2}")] int size = 10, OrderBy orderby = OrderBy.ModifyDate, string kw = "", int? cid = null)
         {
             Expression<Func<Post, bool>> where = p => true;
             if (cid.HasValue)
@@ -684,7 +684,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 where = where.And(p => p.Title.Contains(search) || p.Author.Contains(search) || p.Email.Contains(search) || p.Label.Contains(search));
             }
 
-            var pages = await PostService.GetQuery(where).OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.ModifyDate).ToCachedPagedListAsync<Post, PostDataModel>(page, size, MapperConfig);
+            var pages = await PostService.GetQuery(where).OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.ModifyDate).ToPagedListAsync<Post, PostDataModel>(page, size, MapperConfig);
             foreach (var item in pages.Data)
             {
                 item.ModifyDate = item.ModifyDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
@@ -1097,20 +1097,20 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Id = p.Id,
                 Title = p.Title,
                 ViewCount = p.TotalViewCount
-            }).Cacheable().ToListAsync(cancellationToken);
+            }).ToListAsync(cancellationToken);
             var mostAverage = await postsQuery.OrderByDescending(p => p.AverageViewCount).Take(10).Select(p => new PostModelBase()
             {
                 Id = p.Id,
                 Title = p.Title,
                 ViewCount = (int)p.AverageViewCount
-            }).Cacheable().ToListAsync(cancellationToken);
+            }).ToListAsync(cancellationToken);
             var yesterday = DateTime.Now.AddDays(-1);
             var trending = await postsQuery.Select(p => new PostModelBase()
             {
                 Id = p.Id,
                 Title = p.Title,
                 ViewCount = p.PostVisitRecords.Count(t => t.Time >= yesterday)
-            }).OrderByDescending(p => p.ViewCount).Take(10).Cacheable().ToListAsync(cancellationToken);
+            }).OrderByDescending(p => p.ViewCount).Take(10).ToListAsync(cancellationToken);
             var readCount = PostVisitRecordService.Count(e => e.Time >= yesterday);
             return ResultData(new
             {

+ 9 - 5
src/Masuit.MyBlogs.Core/Controllers/SearchController.cs

@@ -1,17 +1,18 @@
-using EFCoreSecondLevelCacheInterceptor;
-using Masuit.MyBlogs.Core.Common;
+using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.MyBlogs.Core.Models.ViewModel;
+using Masuit.Tools;
 using Masuit.Tools.Core.Net;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Caching.Memory;
 using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;
 using System.ComponentModel.DataAnnotations;
 using System.Linq.Expressions;
-using Masuit.Tools;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -53,7 +54,10 @@ namespace Masuit.MyBlogs.Core.Controllers
                 ViewBag.hotSearches = new List<KeywordsRank>();
                 if (posts.Total > size)
                 {
-                    ViewBag.RelateKeywords = SearchDetailsService.GetQuery(s => s.Keywords.Contains(wd) && s.Keywords != wd).Select(s => s.Keywords).GroupBy(s => s).OrderByDescending(g => g.Count()).Select(g => g.Key).Take(10).Cacheable().ToList();
+                    ViewBag.RelateKeywords = SearchDetailsService.GetQuery(s => s.Keywords.Contains(wd) && s.Keywords != wd).Select(s => s.Keywords).GroupBy(s => s).OrderByDescending(g => g.Count()).Select(g => g.Key).Take(10).FromCache(new MemoryCacheEntryOptions()
+                    {
+                        AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
+                    }).ToList();
                 }
 
                 if (!HttpContext.Session.TryGetValue("search:" + wd, out _) && !Request.IsRobot())
@@ -84,7 +88,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="search"></param>
         /// <returns></returns>
         [MyAuthorize, HttpPost("search/SearchList"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "page", "size", "search" })]
-        public ActionResult SearchList([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15, string search = "")
+        public ActionResult SearchList([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 200, ErrorMessage = "页大小必须在0到50之间")] int size = 15, string search = "")
         {
             var where = string.IsNullOrEmpty(search) ? (Expression<Func<SearchDetails, bool>>)(s => true) : s => s.Keywords.Contains(search);
             var pages = SearchDetailsService.GetPages<DateTime, SearchDetailsDto>(page, size, where, s => s.SearchTime, false);

+ 2 - 2
src/Masuit.MyBlogs.Core/Controllers/SeminarController.cs

@@ -48,8 +48,8 @@ namespace Masuit.MyBlogs.Core.Controllers
             var h24 = DateTime.Today.AddDays(-1);
             var posts = orderBy switch
             {
-                OrderBy.Trending => await PostService.GetQuery(PostBaseWhere().And(p => p.Seminar.Any(x => x.Id == id))).OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
-                _ => await PostService.GetQuery(PostBaseWhere().And(p => p.Seminar.Any(x => x.Id == id))).OrderBy($"{nameof(Post.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
+                OrderBy.Trending => await PostService.GetQuery(PostBaseWhere().And(p => p.Seminar.Any(x => x.Id == id))).OrderByDescending(p => p.PostVisitRecordStats.Where(e => e.Date >= h24).Sum(e => e.Count)).ToPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+                _ => await PostService.GetQuery(PostBaseWhere().And(p => p.Seminar.Any(x => x.Id == id))).OrderBy($"{nameof(Post.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToPagedListAsync<Post, PostDto>(page, size, MapperConfig)
             };
             ViewBag.Id = s.Id;
             ViewBag.Title = s.Title;

+ 4 - 0
src/Masuit.MyBlogs.Core/Controllers/ShareController.cs

@@ -2,6 +2,7 @@
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.Tools.AspNetCore.ModelBinder;
 using Microsoft.AspNetCore.Mvc;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -34,6 +35,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ActionResult Add([FromBodyOrDefault] FastShare share)
         {
             bool b = FastShareService.AddEntitySaved(share) != null;
+            QueryCacheManager.ExpireType<FastShare>();
             return ResultData(null, b, b ? "添加成功" : "添加失败");
         }
 
@@ -46,6 +48,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Remove(int id)
         {
             bool b = await FastShareService.DeleteByIdAsync(id) > 0;
+            QueryCacheManager.ExpireType<FastShare>();
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }
 
@@ -63,6 +66,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Link = model.Link,
                 Sort = model.Sort
             }) > 0;
+            QueryCacheManager.ExpireType<FastShare>();
             return ResultData(null, b, b ? "更新成功" : "更新失败");
         }
     }

+ 14 - 4
src/Masuit.MyBlogs.Core/Controllers/SubscribeController.cs

@@ -1,5 +1,4 @@
 using Collections.Pooled;
-using EFCoreSecondLevelCacheInterceptor;
 using FreeRedis;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
@@ -15,11 +14,13 @@ using Masuit.Tools.Linq;
 using Masuit.Tools.Models;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Caching.Memory;
 using Microsoft.Net.Http.Headers;
 using System.Linq.Expressions;
 using System.Text;
 using System.Text.RegularExpressions;
 using WilderMinds.RssSyndication;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -48,7 +49,10 @@ namespace Masuit.MyBlogs.Core.Controllers
             var time = DateTime.Today.AddDays(-1);
             string scheme = Request.Scheme;
             var host = Request.Host;
-            using var raw = PostService.GetQuery(PostBaseWhere().And(p => p.Rss && p.ModifyDate >= time), p => p.ModifyDate, false).Include(p => p.Category).AsNoTracking().Cacheable().ToPooledList();
+            using var raw = PostService.GetQuery(PostBaseWhere().And(p => p.Rss && p.ModifyDate >= time), p => p.ModifyDate, false).Include(p => p.Category).AsNoTracking().FromCache(new MemoryCacheEntryOptions()
+            {
+                AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(2)
+            }).ToPooledList();
             var data = await raw.SelectAsync(async p =>
             {
                 var summary = await p.Content.GetSummary(300, 50);
@@ -131,7 +135,10 @@ namespace Masuit.MyBlogs.Core.Controllers
             var host = Request.Host;
             var category = await categoryService.GetByIdAsync(id) ?? throw new NotFoundException("分类未找到");
             var cids = category.Flatten().Select(c => c.Id).ToArray();
-            using var raw = PostService.GetQuery(PostBaseWhere().And(p => p.Rss && cids.Contains(p.CategoryId) && p.ModifyDate >= time), p => p.ModifyDate, false).Include(p => p.Category).AsNoTracking().Cacheable().ToPooledList();
+            using var raw = PostService.GetQuery(PostBaseWhere().And(p => p.Rss && cids.Contains(p.CategoryId) && p.ModifyDate >= time), p => p.ModifyDate, false).Include(p => p.Category).AsNoTracking().FromCache(new MemoryCacheEntryOptions()
+            {
+                AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(2)
+            }).ToPooledList();
             var data = await raw.SelectAsync(async p =>
             {
                 var summary = await p.Content.GetSummary(300, 50);
@@ -188,7 +195,10 @@ namespace Masuit.MyBlogs.Core.Controllers
             string scheme = Request.Scheme;
             var host = Request.Host;
             var seminar = await seminarService.GetByIdAsync(id) ?? throw new NotFoundException("专题未找到");
-            using var raw = PostService.GetQuery(PostBaseWhere().And(p => p.Rss && p.Seminar.Any(s => s.Id == id) && p.ModifyDate >= time), p => p.ModifyDate, false).Include(p => p.Category).AsNoTracking().Cacheable().ToPooledList();
+            using var raw = PostService.GetQuery(PostBaseWhere().And(p => p.Rss && p.Seminar.Any(s => s.Id == id) && p.ModifyDate >= time), p => p.ModifyDate, false).Include(p => p.Category).AsNoTracking().FromCache(new MemoryCacheEntryOptions()
+            {
+                AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(2)
+            }).ToPooledList();
             var data = await raw.SelectAsync(async p =>
             {
                 var summary = await p.Content.GetSummary(300, 50);

+ 5 - 3
src/Masuit.MyBlogs.Core/Controllers/ValuesController.cs

@@ -1,9 +1,9 @@
-using EFCoreSecondLevelCacheInterceptor;
-using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
+using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.Tools.AspNetCore.ModelBinder;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -15,13 +15,14 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpGet("list")]
         public async Task<ActionResult> GetAll()
         {
-            return ResultData(await VariablesService.GetAll().NotCacheable().ToListAsync());
+            return ResultData(await VariablesService.GetAllNoTracking().ToListAsync());
         }
 
         [HttpPost]
         public async Task<ActionResult> Save([FromBodyOrDefault] Variables model)
         {
             var b = await VariablesService.AddOrUpdateSavedAsync(v => v.Key, model) > 0;
+            QueryCacheManager.ExpireType<Variables>();
             return ResultData(null, b, b ? "保存成功" : "保存失败");
         }
 
@@ -29,6 +30,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ActionResult Delete(int id)
         {
             var b = VariablesService - id;
+            QueryCacheManager.ExpireType<Variables>();
             return ResultData(null, b, b ? "删除成功" : "保存失败");
         }
     }

+ 18 - 337
src/Masuit.MyBlogs.Core/Infrastructure/Repository/BaseRepository.cs

@@ -1,7 +1,6 @@
 using AutoMapper;
 using AutoMapper.QueryableExtensions;
 using Collections.Pooled;
-using EFCoreSecondLevelCacheInterceptor;
 using Masuit.LuceneEFCore.SearchEngine;
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.Tools.Core.AspNetCore;
@@ -41,24 +40,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return DataContext.Set<T>().AsNoTracking();
         }
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns></returns>
-        public virtual IEnumerable<T> GetAllFromCache()
-        {
-            return DataContext.Set<T>().AsNoTracking().Cacheable().AsEnumerable();
-        }
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns></returns>
-        public Task<List<T>> GetAllFromCacheAsync()
-        {
-            return DataContext.Set<T>().AsNoTracking().Cacheable().ToListAsync();
-        }
-
         /// <summary>
         /// 获取所有实体(不跟踪)
         /// </summary>
@@ -69,26 +50,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return DataContext.Set<T>().AsNoTracking().ProjectTo<TDto>(MapperConfig);
         }
 
-        /// <summary>
-        /// 从二级缓存获取所有实体(不跟踪)
-        /// </summary>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <returns></returns>
-        public virtual PooledList<TDto> GetAllFromCache<TDto>() where TDto : class
-        {
-            return DataContext.Set<T>().ProjectTo<TDto>(MapperConfig).Cacheable().ToPooledList();
-        }
-
-        /// <summary>
-        /// 从二级缓存获取所有实体(不跟踪)
-        /// </summary>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <returns></returns>
-        public Task<List<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class
-        {
-            return DataContext.Set<T>().ProjectTo<TDto>(MapperConfig).Cacheable().ToListAsync();
-        }
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -122,19 +83,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns></returns>
         public virtual PooledList<T> GetAllFromCache<TS>(Expression<Func<T, TS>> orderby, bool isAsc = true)
         {
-            return GetAllNoTracking(orderby, isAsc).Cacheable().ToPooledList();
-        }
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        public Task<List<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return GetAllNoTracking(orderby, isAsc).Cacheable().ToListAsync();
+            return GetAllNoTracking(orderby, isAsc).FromCache().ToPooledList();
         }
 
         /// <summary>
@@ -150,32 +99,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return GetAllNoTracking(orderby, isAsc).ProjectTo<TDto>(MapperConfig);
         }
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual PooledList<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
-        {
-            return GetAll(orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable().ToPooledList();
-        }
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        public Task<List<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
-        {
-            return GetAll(orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable().ToListAsync();
-        }
-
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
@@ -206,17 +129,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns></returns>
         public virtual PooledList<T> GetQueryFromCache(Expression<Func<T, bool>> where)
         {
-            return DataContext.Set<T>().Where(where).AsNoTracking().Cacheable().ToPooledList();
-        }
-
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns></returns>
-        public Task<List<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where)
-        {
-            return DataContext.Set<T>().Where(where).AsNoTracking().Cacheable().ToListAsync();
+            return DataContext.Set<T>().Where(where).AsNoTracking().FromCache().ToPooledList();
         }
 
         /// <summary>
@@ -229,34 +142,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns></returns>
         public virtual PooledList<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
         {
-            return GetQueryNoTracking(where, orderby, isAsc).Cacheable().ToPooledList();
-        }
-
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        public Task<List<T>> GetQueryFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return GetQueryNoTracking(where, orderby, isAsc).Cacheable().ToListAsync();
-        }
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <typeparam name="TDto">输出类型</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        public Task<List<TDto>> GetQueryFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
-        {
-            return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable().ToListAsync();
+            return GetQueryNoTracking(where, orderby, isAsc).FromCache().ToPooledList();
         }
 
         /// <summary>
@@ -306,26 +192,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig);
         }
 
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取(不跟踪实体)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体集合</returns>
-        public virtual PooledList<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> where) where TDto : class
-        {
-            return DataContext.Set<T>().Where(where).ProjectTo<TDto>(MapperConfig).Cacheable().ToPooledList();
-        }
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns></returns>
-        public Task<List<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class
-        {
-            return DataContext.Set<T>().Where(where).ProjectTo<TDto>(MapperConfig).Cacheable().ToListAsync();
-        }
-
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取(不跟踪实体)
         /// </summary>
@@ -337,7 +203,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns></returns>
         public virtual PooledList<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
         {
-            return GetQuery(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable().ToPooledList();
+            return GetQuery(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).FromCache().ToPooledList();
         }
 
         /// <summary>
@@ -350,16 +216,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return EF.CompileQuery((DataContext ctx) => ctx.Set<T>().FirstOrDefault(where))(DataContext);
         }
 
-        /// <summary>
-        /// 获取第一条数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public virtual T GetFromCache(Expression<Func<T, bool>> where)
-        {
-            return DataContext.Set<T>().Where(where).AsNoTracking().DeferredFirstOrDefault().Execute();
-        }
-
         /// <summary>
         /// 获取第一条数据
         /// </summary>
@@ -383,32 +239,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return isAsc ? EF.CompileQuery((DataContext ctx) => ctx.Set<T>().OrderBy(orderby).FirstOrDefault(where))(DataContext) : EF.CompileQuery((DataContext ctx) => ctx.Set<T>().OrderByDescending(orderby).FirstOrDefault(where))(DataContext);
         }
 
-        /// <summary>
-        /// 获取第一条数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        public virtual T GetFromCache<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
-        {
-            return isAsc ? DataContext.Set<T>().OrderBy(orderby).Where(where).AsNoTracking().DeferredFirstOrDefault().Execute() : DataContext.Set<T>().OrderByDescending(orderby).Where(where).AsNoTracking().DeferredFirstOrDefault().Execute();
-        }
-
-        /// <summary>
-        /// 获取第一条数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        public Task<T> GetFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return isAsc ? DataContext.Set<T>().OrderBy(orderby).Where(where).AsNoTracking().DeferredFirstOrDefault().ExecuteAsync() : DataContext.Set<T>().OrderByDescending(orderby).Where(where).AsNoTracking().DeferredFirstOrDefault().ExecuteAsync();
-        }
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据(不跟踪)
         /// </summary>
@@ -423,20 +253,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefaultAsync() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefaultAsync();
         }
 
-        /// <summary>
-        /// 获取第一条被AutoMapper映射后的数据(不跟踪)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>映射实体</returns>
-        public virtual TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
-        {
-            return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().Execute() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().Execute();
-        }
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -484,19 +300,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return EF.CompileQuery((DataContext ctx) => ctx.Set<T>().AsNoTracking().FirstOrDefault(where))(DataContext);
         }
 
-        /// <summary>
-        /// 获取第一条数据(不跟踪实体)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        public virtual T GetNoTracking<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
-        {
-            return isAsc ? EF.CompileQuery((DataContext ctx) => ctx.Set<T>().AsNoTracking().OrderBy(orderby).FirstOrDefault(where))(DataContext) : EF.CompileQuery((DataContext ctx) => ctx.Set<T>().AsNoTracking().OrderByDescending(orderby).FirstOrDefault(where))(DataContext);
-        }
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据(不跟踪实体)
         /// </summary>
@@ -507,26 +310,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefault();
         }
 
-        /// <summary>
-        /// 获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public virtual TDto GetFromCache<TDto>(Expression<Func<T, bool>> where) where TDto : class
-        {
-            return DataContext.Set<T>().Where(where).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().Execute();
-        }
-
-        /// <summary>
-        /// 获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public Task<TDto> GetFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class
-        {
-            return DataContext.Set<T>().Where(where).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().ExecuteAsync();
-        }
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据(不跟踪实体)
         /// </summary>
@@ -541,29 +324,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefault() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefault();
         }
 
-        /// <summary>
-        /// 获取第一条数据(异步,不跟踪实体)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public virtual Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> where)
-        {
-            return EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().AsNoTracking().FirstOrDefault(@where))(DataContext);
-        }
-
-        /// <summary>
-        /// 获取第一条数据(异步,不跟踪实体)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        public virtual Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
-        {
-            return isAsc ? EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().OrderBy(orderby).AsNoTracking().FirstOrDefault(where))(DataContext) : EF.CompileAsyncQuery((DataContext ctx) => ctx.Set<T>().OrderByDescending(orderby).AsNoTracking().FirstOrDefault(where))(DataContext);
-        }
-
         /// <summary>
         /// 根据ID找实体
         /// </summary>
@@ -585,7 +345,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         }
 
         /// <summary>
-        /// 高效分页查询方法
+        /// 标准分页查询方法
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -596,11 +356,11 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns></returns>
         public virtual PagedList<T> GetPages<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc)
         {
-            return isAsc ? DataContext.Set<T>().Where(where).NotCacheable().OrderBy(orderby).ToPagedList(pageIndex, pageSize) : DataContext.Set<T>().Where(where).NotCacheable().OrderByDescending(orderby).ToPagedList(pageIndex, pageSize);
+            return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).ToPagedList(pageIndex, pageSize) : DataContext.Set<T>().Where(where).OrderByDescending(orderby).ToPagedList(pageIndex, pageSize);
         }
 
         /// <summary>
-        /// 高效分页查询方法
+        /// 标准分页查询方法
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -611,60 +371,11 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns></returns>
         public virtual Task<PagedList<T>> GetPagesAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> orderby, bool isAsc)
         {
-            return isAsc ? DataContext.Set<T>().Where(where).NotCacheable().OrderBy(orderby).ToPagedListAsync(pageIndex, pageSize) : DataContext.Set<T>().Where(where).NotCacheable().OrderByDescending(orderby).ToPagedListAsync(pageIndex, pageSize);
-        }
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        public virtual PagedList<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc)
-        {
-            var temp = DataContext.Set<T>().Where(where).AsNoTracking();
-            return isAsc ? temp.OrderBy(orderby).ToCachedPagedList(pageIndex, pageSize) : temp.OrderByDescending(orderby).ToCachedPagedList(pageIndex, pageSize);
-        }
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        public virtual Task<PagedList<T>> GetPagesFromCacheAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc)
-        {
-            var temp = DataContext.Set<T>().Where(where).AsNoTracking();
-            return isAsc ? temp.OrderBy(orderby).ToCachedPagedListAsync(pageIndex, pageSize) : temp.OrderByDescending(orderby).ToCachedPagedListAsync(pageIndex, pageSize);
-        }
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <typeparam name="TDto"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        public Task<PagedList<TDto>> GetPagesFromCacheAsync<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class
-        {
-            var temp = DataContext.Set<T>().Where(where).AsNoTracking();
-            return isAsc ? temp.OrderBy(orderby).ToCachedPagedListAsync<T, TDto>(pageIndex, pageSize, MapperConfig) : temp.OrderByDescending(orderby).ToCachedPagedListAsync<T, TDto>(pageIndex, pageSize, MapperConfig);
+            return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).ToPagedListAsync(pageIndex, pageSize) : DataContext.Set<T>().Where(where).OrderByDescending(orderby).ToPagedListAsync(pageIndex, pageSize);
         }
 
         /// <summary>
-        /// 高效分页查询方法(不跟踪实体)
+        /// 标准分页查询方法(不跟踪实体)
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -675,11 +386,11 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns></returns>
         public virtual PagedList<T> GetPagesNoTracking<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
         {
-            return isAsc ? DataContext.Set<T>().Where(where).AsNoTracking().NotCacheable().OrderBy(orderby).ToPagedList(pageIndex, pageSize) : DataContext.Set<T>().Where(where).AsNoTracking().NotCacheable().OrderByDescending(orderby).ToPagedList(pageIndex, pageSize);
+            return isAsc ? DataContext.Set<T>().Where(where).AsNoTracking().OrderBy(orderby).ToPagedList(pageIndex, pageSize) : DataContext.Set<T>().Where(where).AsNoTracking().OrderByDescending(orderby).ToPagedList(pageIndex, pageSize);
         }
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合(不跟踪实体)
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合(不跟踪实体)
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -695,7 +406,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         }
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -711,7 +422,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         }
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合,优先从缓存读取(不跟踪实体)
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合,优先从缓存读取(不跟踪实体)
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -770,22 +481,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return DataContext.Set<T>().Where(where).Delete();
         }
 
-        /// <summary>
-        /// 根据条件删除实体(异步)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>删除成功</returns>
-        public virtual Task<int> DeleteEntityAsync(Expression<Func<T, bool>> where)
-        {
-            return DataContext.Set<T>().Where(where).DeleteAsync();
-        }
-
         /// <summary>
         /// 添加实体
         /// </summary>
         /// <param name="t">需要添加的实体</param>
         /// <returns>添加成功</returns>
-        public abstract T AddEntity(T t);
+        public T AddEntity(T t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
 
         /// <summary>
         /// 添加或更新实体
@@ -799,17 +504,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return t;
         }
 
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="entities">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        public void AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, params T[] entities)
-        {
-            DataContext.Set<T>().AddOrUpdate(key, entities);
-        }
-
         /// <summary>
         /// 添加或更新实体
         /// </summary>
@@ -870,21 +564,8 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return true;
         }
 
-        /// <summary>
-        /// 添加多个实体
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>添加成功</returns>
-        public virtual IEnumerable<T> AddEntities(IList<T> list)
-        {
-            DataContext.AddRange(list);
-            return list;
-        }
-
         public override void Dispose(bool disposing)
         {
-            //DataContext?.Dispose();
-            //DataContext = null;
         }
 
         public T this[int id] => GetById(id);

+ 4 - 15
src/Masuit.MyBlogs.Core/Infrastructure/Repository/CommentRepository.cs

@@ -1,19 +1,8 @@
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
 
-namespace Masuit.MyBlogs.Core.Infrastructure.Repository
+namespace Masuit.MyBlogs.Core.Infrastructure.Repository;
+
+public partial class CommentRepository : BaseRepository<Comment>, ICommentRepository
 {
-    public partial class CommentRepository : BaseRepository<Comment>, ICommentRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Comment AddEntity(Comment t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
-}
+}

+ 8 - 243
src/Masuit.MyBlogs.Core/Infrastructure/Repository/Interface/IBaseRepository.cs

@@ -1,8 +1,8 @@
-using Masuit.LuceneEFCore.SearchEngine;
+using Collections.Pooled;
+using Masuit.LuceneEFCore.SearchEngine;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.Tools.Models;
 using System.Linq.Expressions;
-using Collections.Pooled;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
 {
@@ -20,18 +20,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</returns>
         IQueryable<T> GetAllNoTracking();
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns></returns>
-        IEnumerable<T> GetAllFromCache();
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns></returns>
-        Task<List<T>> GetAllFromCacheAsync();
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -39,20 +27,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</returns>
         IQueryable<TDto> GetAll<TDto>() where TDto : class;
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <returns></returns>
-        PooledList<TDto> GetAllFromCache<TDto>() where TDto : class;
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <returns></returns>
-        Task<List<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class;
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -80,15 +54,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns></returns>
         PooledList<T> GetAllFromCache<TS>(Expression<Func<T, TS>> orderby, bool isAsc = true);
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        Task<List<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -99,26 +64,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</returns>
         IQueryable<TDto> GetAll<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        PooledList<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class;
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        Task<List<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
-
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
@@ -162,13 +107,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns></returns>
         PooledList<T> GetQueryFromCache(Expression<Func<T, bool>> where);
 
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns></returns>
-        Task<List<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where);
-
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
         /// </summary>
@@ -179,30 +117,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns></returns>
         PooledList<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true);
 
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        Task<List<T>> GetQueryFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns></returns>
-        PooledList<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> where) where TDto : class;
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns></returns>
-        Task<List<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
-
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
@@ -214,17 +128,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns></returns>
         PooledList<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class;
 
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <typeparam name="TDto">输出类型</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        Task<List<TDto>> GetQueryFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
-
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
         /// </summary>
@@ -249,13 +152,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>实体</returns>
         T Get(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 从二级缓存获取第一条数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        T GetFromCache(Expression<Func<T, bool>> @where);
-
         /// <summary>
         /// 从二级缓存获取第一条数据
         /// </summary>
@@ -273,26 +169,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>实体</returns>
         T Get<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
-        /// <summary>
-        /// 获取第一条数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        T GetFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <summary>
-        /// 从二级缓存获取第一条数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        Task<T> GetFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -300,20 +176,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>实体</returns>
         TDto Get<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        TDto GetFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
-
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        Task<TDto> GetFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -336,17 +198,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>映射实体</returns>
         Task<TDto> GetAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>映射实体</returns>
-        TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
-
         /// <summary>
         /// 从二级缓存获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -382,33 +233,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>实体</returns>
         T GetNoTracking(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 获取第一条数据(不跟踪实体)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        T GetNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <summary>
-        /// 获取第一条数据(异步,不跟踪实体)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> @where);
-
-        /// <summary>
-        /// 获取第一条数据(异步,不跟踪实体)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
         /// <summary>
         /// 根据ID找实体
         /// </summary>
@@ -424,7 +248,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         Task<T> GetByIdAsync(int id);
 
         /// <summary>
-        /// 高效分页查询方法
+        /// 标准分页查询方法
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -436,7 +260,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         PagedList<T> GetPages<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc);
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -449,7 +273,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         PagedList<TDto> GetPages<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class;
 
         /// <summary>
-        /// 高效分页查询方法
+        /// 标准分页查询方法
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -461,7 +285,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         Task<PagedList<T>> GetPagesAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc);
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -474,31 +298,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         Task<PagedList<TDto>> GetPagesAsync<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class;
 
         /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        PagedList<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc);
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        Task<PagedList<T>> GetPagesFromCacheAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> orderby, bool isAsc);
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -511,20 +311,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         PagedList<TDto> GetPagesFromCache<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class;
 
         /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <typeparam name="TDto"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        Task<PagedList<TDto>> GetPagesFromCacheAsync<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class;
-
-        /// <summary>
-        /// 高效分页查询方法(不跟踪实体)
+        /// 标准分页查询方法(不跟踪实体)
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -563,13 +350,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>删除成功</returns>
         int DeleteEntity(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 根据条件删除实体(异步)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>删除成功</returns>
-        Task<int> DeleteEntityAsync(Expression<Func<T, bool>> @where);
-
         /// <summary>
         /// 添加实体
         /// </summary>
@@ -585,14 +365,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>保存成功</returns>
         T AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, T t);
 
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="entities">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        void AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, params T[] entities);
-
         /// <summary>
         /// 添加或更新实体
         /// </summary>
@@ -634,13 +406,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>删除成功</returns>
         bool DeleteEntities(IEnumerable<T> list);
 
-        /// <summary>
-        /// 添加多个实体
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>添加成功</returns>
-        IEnumerable<T> AddEntities(IList<T> list);
-
         void Dispose(bool disposing);
 
         T this[int id] => GetById(id);

+ 4 - 15
src/Masuit.MyBlogs.Core/Infrastructure/Repository/LeaveMessageRepository.cs

@@ -1,19 +1,8 @@
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
 
-namespace Masuit.MyBlogs.Core.Infrastructure.Repository
+namespace Masuit.MyBlogs.Core.Infrastructure.Repository;
+
+public partial class LeaveMessageRepository : BaseRepository<LeaveMessage>, ILeaveMessageRepository
 {
-    public partial class LeaveMessageRepository : BaseRepository<LeaveMessage>, ILeaveMessageRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override LeaveMessage AddEntity(LeaveMessage t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
-}
+}

+ 5 - 20
src/Masuit.MyBlogs.Core/Infrastructure/Repository/MenuRepository.cs

@@ -1,23 +1,8 @@
-using EFCoreSecondLevelCacheInterceptor;
-using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
+using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
-using Microsoft.EntityFrameworkCore;
-using System.Linq.Expressions;
-using Z.EntityFramework.Plus;
 
-namespace Masuit.MyBlogs.Core.Infrastructure.Repository
+namespace Masuit.MyBlogs.Core.Infrastructure.Repository;
+
+public partial class MenuRepository : BaseRepository<Menu>, IMenuRepository
 {
-    public partial class MenuRepository : BaseRepository<Menu>, IMenuRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Menu AddEntity(Menu t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
-}
+}

+ 34 - 46
src/Masuit.MyBlogs.Core/Infrastructure/Repository/PostRepository.cs

@@ -1,56 +1,44 @@
-using EFCoreSecondLevelCacheInterceptor;
+using Collections.Pooled;
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Microsoft.EntityFrameworkCore;
 using System.Linq.Expressions;
-using Collections.Pooled;
+using Z.EntityFramework.Plus;
 
-namespace Masuit.MyBlogs.Core.Infrastructure.Repository
+namespace Masuit.MyBlogs.Core.Infrastructure.Repository;
+
+public partial class PostRepository : BaseRepository<Post>, IPostRepository
 {
-    public partial class PostRepository : BaseRepository<Post>, IPostRepository
+    /// <summary>
+    /// 获取第一条数据,优先从缓存读取
+    /// </summary>
+    /// <param name="where">查询条件</param>
+    /// <returns>实体</returns>
+    public override Task<Post> GetAsync(Expression<Func<Post, bool>> @where)
     {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Post AddEntity(Post t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-
-        /// <summary>
-        /// 获取第一条数据,优先从缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public override Task<Post> GetAsync(Expression<Func<Post, bool>> @where)
-        {
-            return EF.CompileAsyncQuery((DataContext ctx) => ctx.Post.Include(p => p.Category).Include(p => p.Seminar).FirstOrDefault(@where))(DataContext);
-        }
+        return EF.CompileAsyncQuery((DataContext ctx) => ctx.Post.Include(p => p.Category).Include(p => p.Seminar).FirstOrDefault(@where))(DataContext);
+    }
 
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public override PooledList<Post> GetQueryFromCache(Expression<Func<Post, bool>> where)
-        {
-            return DataContext.Post.Include(p => p.Category).Where(where).Cacheable().ToPooledList();
-        }
+    /// <summary>
+    /// 基本查询方法,获取一个集合,优先从二级缓存读取
+    /// </summary>
+    /// <param name="where">查询条件</param>
+    /// <returns>还未执行的SQL语句</returns>
+    public override PooledList<Post> GetQueryFromCache(Expression<Func<Post, bool>> where)
+    {
+        return DataContext.Post.Include(p => p.Category).Where(where).FromCache().ToPooledList();
+    }
 
-        /// <summary>
-        /// 基本查询方法,获取一个集合
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public override IOrderedQueryable<Post> GetQuery<TS>(Expression<Func<Post, bool>> @where, Expression<Func<Post, TS>> @orderby, bool isAsc = true)
-        {
-            return isAsc ? DataContext.Post.Include(p => p.Category).Where(where).OrderBy(orderby) : DataContext.Post.Include(p => p.Category).Where(where).OrderByDescending(orderby);
-        }
+    /// <summary>
+    /// 基本查询方法,获取一个集合
+    /// </summary>
+    /// <typeparam name="TS">排序</typeparam>
+    /// <param name="where">查询条件</param>
+    /// <param name="orderby">排序字段</param>
+    /// <param name="isAsc">是否升序</param>
+    /// <returns>还未执行的SQL语句</returns>
+    public override IOrderedQueryable<Post> GetQuery<TS>(Expression<Func<Post, bool>> @where, Expression<Func<Post, TS>> @orderby, bool isAsc = true)
+    {
+        return isAsc ? DataContext.Post.Include(p => p.Category).Where(where).OrderBy(orderby) : DataContext.Post.Include(p => p.Category).Where(where).OrderByDescending(orderby);
     }
-}
+}

+ 5 - 59
src/Masuit.MyBlogs.Core/Infrastructure/Repository/QueryableExt.cs

@@ -1,9 +1,9 @@
 using AutoMapper;
 using AutoMapper.QueryableExtensions;
-using EFCoreSecondLevelCacheInterceptor;
 using Masuit.LuceneEFCore.SearchEngine;
 using Masuit.Tools.Models;
 using Microsoft.EntityFrameworkCore;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Repository;
 
@@ -31,36 +31,10 @@ public static class QueryableExt
             page = 1;
         }
 
-        var list = query.Skip(size * (page - 1)).Take(size).Cacheable().ToList();
+        var list = query.Skip(size * (page - 1)).Take(size).FromCache().ToList();
         return new PagedList<T>(list, page, size, totalCount);
     }
 
-    /// <summary>
-    /// 从二级缓存生成分页集合
-    /// </summary>
-    /// <typeparam name="T"></typeparam>
-    /// <param name="query"></param>
-    /// <param name="page">当前页</param>
-    /// <param name="size">页大小</param>
-    /// <returns></returns>
-    public static async Task<PagedList<T>> ToCachedPagedListAsync<T>(this IOrderedQueryable<T> query, int page, int size) where T : LuceneIndexableBaseEntity
-    {
-        page = Math.Max(1, page);
-        var totalCount = query.Count();
-        if (1L * page * size > totalCount)
-        {
-            page = (int)Math.Ceiling(totalCount / (size * 1.0));
-        }
-
-        if (page <= 0)
-        {
-            page = 1;
-        }
-
-        var list = await query.Skip(size * (page - 1)).Take(size).Cacheable().ToListAsync();
-        return new PagedList<T>(list.ToList(), page, size, totalCount);
-    }
-
     /// <summary>
     /// 生成分页集合
     /// </summary>
@@ -85,7 +59,7 @@ public static class QueryableExt
             page = 1;
         }
 
-        var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).NotCacheable().ToList();
+        var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).ToList();
         return new PagedList<TDto>(list, page, size, totalCount);
     }
 
@@ -113,7 +87,7 @@ public static class QueryableExt
             page = 1;
         }
 
-        var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).NotCacheable().ToListAsync();
+        var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).ToListAsync();
         return new PagedList<TDto>(list, page, size, totalCount);
     }
 
@@ -141,35 +115,7 @@ public static class QueryableExt
             page = 1;
         }
 
-        var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).Cacheable().ToList();
+        var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).FromCache().ToList();
         return new PagedList<TDto>(list, page, size, totalCount);
     }
-
-    /// <summary>
-    /// 从二级缓存生成分页集合
-    /// </summary>
-    /// <typeparam name="T"></typeparam>
-    /// <typeparam name="TDto"></typeparam>
-    /// <param name="query"></param>
-    /// <param name="page">当前页</param>
-    /// <param name="size">页大小</param>
-    /// <param name="mapper"></param>
-    /// <returns></returns>
-    public static async Task<PagedList<TDto>> ToCachedPagedListAsync<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper) where TDto : class where T : LuceneIndexableBaseEntity
-    {
-        page = Math.Max(1, page);
-        var totalCount = query.Count();
-        if (1L * page * size > totalCount)
-        {
-            page = (int)Math.Ceiling(totalCount / (size * 1.0));
-        }
-
-        if (page <= 0)
-        {
-            page = 1;
-        }
-
-        var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).Cacheable().ToListAsync();
-        return new PagedList<TDto>(list.ToList(), page, size, totalCount);
-    }
 }

+ 61 - 290
src/Masuit.MyBlogs.Core/Infrastructure/Repository/Repositories.cs

@@ -1,313 +1,84 @@
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
 
-namespace Masuit.MyBlogs.Core.Infrastructure.Repository
-{
-    public partial class CategoryRepository : BaseRepository<Category>, ICategoryRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Category AddEntity(Category t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
-
-    public partial class DonateRepository : BaseRepository<Donate>, IDonateRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Donate AddEntity(Donate t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
-
-    public partial class FastShareRepository : BaseRepository<FastShare>, IFastShareRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override FastShare AddEntity(FastShare t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+namespace Masuit.MyBlogs.Core.Infrastructure.Repository;
 
-    public partial class InternalMessageRepository : BaseRepository<InternalMessage>, IInternalMessageRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override InternalMessage AddEntity(InternalMessage t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class CategoryRepository : BaseRepository<Category>, ICategoryRepository
+{
+}
 
-    public partial class LinksRepository : BaseRepository<Links>, ILinksRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Links AddEntity(Links t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class DonateRepository : BaseRepository<Donate>, IDonateRepository
+{
+}
 
-    public partial class LinkLoopbackRepository : BaseRepository<LinkLoopback>, ILinkLoopbackRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override LinkLoopback AddEntity(LinkLoopback t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class FastShareRepository : BaseRepository<FastShare>, IFastShareRepository
+{
+}
 
-    public partial class LoginRecordRepository : BaseRepository<LoginRecord>, ILoginRecordRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override LoginRecord AddEntity(LoginRecord t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class InternalMessageRepository : BaseRepository<InternalMessage>, IInternalMessageRepository
+{
+}
 
-    public partial class MiscRepository : BaseRepository<Misc>, IMiscRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Misc AddEntity(Misc t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class LinksRepository : BaseRepository<Links>, ILinksRepository
+{
+}
 
-    public partial class NoticeRepository : BaseRepository<Notice>, INoticeRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Notice AddEntity(Notice t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class LinkLoopbackRepository : BaseRepository<LinkLoopback>, ILinkLoopbackRepository
+{
+}
 
-    public partial class PostHistoryVersionRepository : BaseRepository<PostHistoryVersion>, IPostHistoryVersionRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override PostHistoryVersion AddEntity(PostHistoryVersion t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class LoginRecordRepository : BaseRepository<LoginRecord>, ILoginRecordRepository
+{
+}
 
-    public partial class SeminarRepository : BaseRepository<Seminar>, ISeminarRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Seminar AddEntity(Seminar t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class MiscRepository : BaseRepository<Misc>, IMiscRepository
+{
+}
 
-    public partial class SystemSettingRepository : BaseRepository<SystemSetting>, ISystemSettingRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override SystemSetting AddEntity(SystemSetting t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class NoticeRepository : BaseRepository<Notice>, INoticeRepository
+{
+}
 
-    public partial class UserInfoRepository : BaseRepository<UserInfo>, IUserInfoRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override UserInfo AddEntity(UserInfo t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class PostHistoryVersionRepository : BaseRepository<PostHistoryVersion>, IPostHistoryVersionRepository
+{
+}
 
-    //public partial class SeminarPostRepository : BaseRepository<SeminarPost>, ISeminarPostRepository
-    //{
-    //    /// <summary>
-    //    /// 添加实体
-    //    /// </summary>
-    //    /// <param name="t">需要添加的实体</param>
-    //    /// <returns>添加成功</returns>
-    //    public override SeminarPost AddEntity(SeminarPost t)
-    //    {
-    //        DataContext.Add(t);
-    //        return t;
-    //    }
-    //}
+public partial class SeminarRepository : BaseRepository<Seminar>, ISeminarRepository
+{
+}
 
-    //public partial class SeminarPostHistoryVersionRepository : BaseRepository<SeminarPostHistoryVersion>, ISeminarPostHistoryVersionRepository
-    //{
-    //    /// <summary>
-    //    /// 添加实体
-    //    /// </summary>
-    //    /// <param name="t">需要添加的实体</param>
-    //    /// <returns>添加成功</returns>
-    //    public override SeminarPostHistoryVersion AddEntity(SeminarPostHistoryVersion t)
-    //    {
-    //        DataContext.Add(t);
-    //        return t;
-    //    }
-    //}
+public partial class SystemSettingRepository : BaseRepository<SystemSetting>, ISystemSettingRepository
+{
+}
 
-    public partial class PostMergeRequestRepository : BaseRepository<PostMergeRequest>, IPostMergeRequestRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override PostMergeRequest AddEntity(PostMergeRequest t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class UserInfoRepository : BaseRepository<UserInfo>, IUserInfoRepository
+{
+}
 
-    public partial class AdvertisementRepository : BaseRepository<Advertisement>, IAdvertisementRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Advertisement AddEntity(Advertisement t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class PostMergeRequestRepository : BaseRepository<PostMergeRequest>, IPostMergeRequestRepository
+{
+}
 
-    public partial class AdvertisementClickRecordRepository : BaseRepository<AdvertisementClickRecord>, IAdvertisementClickRecordRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override AdvertisementClickRecord AddEntity(AdvertisementClickRecord t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class AdvertisementRepository : BaseRepository<Advertisement>, IAdvertisementRepository
+{
+}
 
-    public partial class VariablesRepository : BaseRepository<Variables>, IVariablesRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Variables AddEntity(Variables t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class AdvertisementClickRecordRepository : BaseRepository<AdvertisementClickRecord>, IAdvertisementClickRecordRepository
+{
+}
 
-    public partial class PostVisitRecordRepository : BaseRepository<PostVisitRecord>, IPostVisitRecordRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override PostVisitRecord AddEntity(PostVisitRecord t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class VariablesRepository : BaseRepository<Variables>, IVariablesRepository
+{
+}
 
-    public partial class PostVisitRecordStatsRepository : BaseRepository<PostVisitRecordStats>, IPostVisitRecordStatsRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override PostVisitRecordStats AddEntity(PostVisitRecordStats t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class PostVisitRecordRepository : BaseRepository<PostVisitRecord>, IPostVisitRecordRepository
+{
+}
 
-    public partial class PostTagsRepository : BaseRepository<PostTag>, IPostTagsRepository
-    {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override PostTag AddEntity(PostTag t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-    }
+public partial class PostVisitRecordStatsRepository : BaseRepository<PostVisitRecordStats>, IPostVisitRecordStatsRepository
+{
 }
+
+public partial class PostTagsRepository : BaseRepository<PostTag>, IPostTagsRepository
+{
+}

+ 11 - 23
src/Masuit.MyBlogs.Core/Infrastructure/Repository/SearchDetailsRepository.cs

@@ -1,29 +1,17 @@
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
 
-namespace Masuit.MyBlogs.Core.Infrastructure.Repository
+namespace Masuit.MyBlogs.Core.Infrastructure.Repository;
+
+public partial class SearchDetailsRepository : BaseRepository<SearchDetails>, ISearchDetailsRepository
 {
-    public partial class SearchDetailsRepository : BaseRepository<SearchDetails>, ISearchDetailsRepository
+    /// <summary>
+    /// 热词统计
+    /// </summary>
+    /// <param name="start"></param>
+    /// <returns></returns>
+    public List<SearchRank> GetRanks(DateTime start)
     {
-        /// <summary>
-        /// 添加实体
-        /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override SearchDetails AddEntity(SearchDetails t)
-        {
-            DataContext.Add(t);
-            return t;
-        }
-
-        /// <summary>
-        /// 热词统计
-        /// </summary>
-        /// <param name="start"></param>
-        /// <returns></returns>
-        public List<SearchRank> GetRanks(DateTime start)
-        {
-            return DataContext.SearchDetails.Where(s => s.SearchTime > start).Select(s => new { s.IP, s.Keywords }).Distinct().GroupBy(s => s.Keywords).Select(g => new SearchRank { Keywords = g.Key, Count = g.Count() }).OrderByDescending(s => s.Count).Take(30).ToList();
-        }
+        return DataContext.SearchDetails.Where(s => s.SearchTime > start).Select(s => new { s.IP, s.Keywords }).Distinct().GroupBy(s => s.Keywords).Select(g => new SearchRank { Keywords = g.Key, Count = g.Count() }).OrderByDescending(s => s.Count).Take(30).ToList();
     }
-}
+}

+ 6 - 2
src/Masuit.MyBlogs.Core/Infrastructure/Services/AdvertisementService.cs

@@ -1,5 +1,4 @@
 using CacheManager.Core;
-using EFCoreSecondLevelCacheInterceptor;
 using Masuit.LuceneEFCore.SearchEngine.Interfaces;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
@@ -9,8 +8,10 @@ using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.Tools;
 using Masuit.Tools.Linq;
 using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Caching.Memory;
 using System.Linq.Expressions;
 using System.Text.RegularExpressions;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Services
 {
@@ -60,7 +61,10 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
                 where = where.And(a => a.RegionMode == RegionLimitMode.All || (a.RegionMode == RegionLimitMode.AllowRegion ? Regex.IsMatch(location, a.Regions, RegexOptions.IgnoreCase) : !Regex.IsMatch(location, a.Regions, RegexOptions.IgnoreCase)));
                 if (cid.HasValue)
                 {
-                    var pids = CategoryRepository.GetQuery(c => c.Id == cid).Select(c => c.ParentId + "|" + c.Parent.ParentId).Cacheable().ToArray();
+                    var pids = CategoryRepository.GetQuery(c => c.Id == cid).Select(c => c.ParentId + "|" + c.Parent.ParentId).FromCache(new MemoryCacheEntryOptions()
+                    {
+                        AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(5)
+                    }).ToArray();
                     var scid = pids.Select(s => s.Trim('|')).Where(s => !string.IsNullOrEmpty(s)).Append(cid + "").Join("|");
                     if (Any(a => Regex.IsMatch(a.CategoryIds, scid)))
                     {

+ 10 - 386
src/Masuit.MyBlogs.Core/Infrastructure/Services/BaseService.cs

@@ -1,4 +1,5 @@
-using Masuit.LuceneEFCore.SearchEngine;
+using Collections.Pooled;
+using Masuit.LuceneEFCore.SearchEngine;
 using Masuit.LuceneEFCore.SearchEngine.Interfaces;
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
@@ -42,24 +43,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetAllNoTracking();
         }
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> GetAllFromCache()
-        {
-            return BaseDal.GetAllFromCache();
-        }
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<List<T>> GetAllFromCacheAsync()
-        {
-            return BaseDal.GetAllFromCacheAsync();
-        }
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -70,26 +53,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetAll<TDto>();
         }
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class
-        {
-            return BaseDal.GetAllFromCache<TDto>();
-        }
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<List<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class
-        {
-            return BaseDal.GetAllFromCacheAsync<TDto>();
-        }
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -121,23 +84,11 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> GetAllFromCache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual PooledList<T> GetAllFromCache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
             return BaseDal.GetAllFromCache(orderby, isAsc);
         }
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<List<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.GetAllFromCacheAsync(@orderby, isAsc);
-        }
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -151,32 +102,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetAll<TS, TDto>(orderby, isAsc);
         }
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
-        {
-            return BaseDal.GetAllFromCache<TS, TDto>(orderby, isAsc);
-        }
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<List<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
-        {
-            return BaseDal.GetAllFromCacheAsync<TS, TDto>(@orderby, isAsc);
-        }
-
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
@@ -235,16 +160,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetQueryFromCache(where);
         }
 
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<List<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where)
-        {
-            return BaseDal.GetQueryFromCacheAsync(@where);
-        }
-
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
         /// </summary>
@@ -258,39 +173,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetQueryFromCache(where, orderby, isAsc);
         }
 
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<List<T>> GetQueryFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.GetQueryFromCacheAsync(@where, @orderby, isAsc);
-        }
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class
-        {
-            return BaseDal.GetQueryFromCache<TDto>(where);
-        }
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<List<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class
-        {
-            return BaseDal.GetQueryFromCacheAsync<TDto>(@where);
-        }
-
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
@@ -300,25 +182,11 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        public virtual PooledList<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
             return BaseDal.GetQueryFromCache<TS, TDto>(where, orderby, isAsc);
         }
 
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <typeparam name="TDto">输出类型</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<List<TDto>> GetQueryFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
-        {
-            return BaseDal.GetQueryFromCacheAsync<TS, TDto>(@where, @orderby, isAsc);
-        }
-
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
         /// </summary>
@@ -352,16 +220,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.Get(where);
         }
 
-        /// <summary>
-        /// 从二级缓存获取第一条数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public virtual T GetFromCache(Expression<Func<T, bool>> @where)
-        {
-            return BaseDal.GetFromCache(where);
-        }
-
         /// <summary>
         /// 从二级缓存获取第一条数据
         /// </summary>
@@ -385,32 +243,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.Get(where, orderby, isAsc);
         }
 
-        /// <summary>
-        /// 从二级缓存获取第一条数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        public T GetFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.GetFromCache(where, orderby, isAsc);
-        }
-
-        /// <summary>
-        /// 从二级缓存获取第一条数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        public Task<T> GetFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.GetFromCacheAsync(where, orderby, isAsc);
-        }
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -421,26 +253,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.Get<TDto>(where);
         }
 
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public TDto GetFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class
-        {
-            return BaseDal.GetFromCache<TDto>(where);
-        }
-
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public Task<TDto> GetFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class
-        {
-            return BaseDal.GetFromCacheAsync<TDto>(where);
-        }
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -469,20 +281,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetAsync<TS, TDto>(where, orderby, isAsc);
         }
 
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>映射实体</returns>
-        public TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
-        {
-            return BaseDal.GetFromCache<TS, TDto>(where, orderby, isAsc);
-        }
-
         /// <summary>
         /// 从二级缓存获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -530,42 +328,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetNoTracking(where);
         }
 
-        /// <summary>
-        /// 获取第一条数据(不跟踪实体)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        public virtual T GetNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.GetNoTracking(where, orderby, isAsc);
-        }
-
-        /// <summary>
-        /// 获取第一条数据(异步,不跟踪实体)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        public virtual Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> @where)
-        {
-            return BaseDal.GetNoTrackingAsync(where);
-        }
-
-        /// <summary>
-        /// 获取第一条数据(异步,不跟踪实体)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        public virtual Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.GetNoTrackingAsync(where, orderby, isAsc);
-        }
-
         /// <summary>
         /// 根据ID找实体
         /// </summary>
@@ -587,7 +349,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         }
 
         /// <summary>
-        /// 高效分页查询方法
+        /// 标准分页查询方法
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -602,7 +364,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         }
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS">排序字段</typeparam>
         /// <typeparam name="TDto">映射实体</typeparam>
@@ -618,7 +380,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         }
 
         /// <summary>
-        /// 高效分页查询方法
+        /// 标准分页查询方法
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -633,7 +395,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         }
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -649,37 +411,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         }
 
         /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual PagedList<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.GetPagesFromCache(pageIndex, pageSize, where, orderby, isAsc);
-        }
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<PagedList<T>> GetPagesFromCacheAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc)
-        {
-            return BaseDal.GetPagesFromCacheAsync(pageIndex, pageSize, where, orderby, isAsc);
-        }
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS">排序字段</typeparam>
         /// <typeparam name="TDto">映射实体</typeparam>
@@ -695,23 +427,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         }
 
         /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <typeparam name="TDto"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public Task<PagedList<TDto>> GetPagesFromCacheAsync<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class
-        {
-            return BaseDal.GetPagesFromCacheAsync<TS, TDto>(pageIndex, pageSize, where, orderby, isAsc);
-        }
-
-        /// <summary>
-        /// 高效分页查询方法(不跟踪实体)
+        /// 标准分页查询方法(不跟踪实体)
         /// </summary>
         /// <typeparam name="TS">排序字段</typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -787,16 +503,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return SaveChangesAsync();
         }
 
-        /// <summary>
-        /// 根据条件删除实体(异步)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>删除成功</returns>
-        public virtual Task<int> DeleteEntityAsync(Expression<Func<T, bool>> @where)
-        {
-            return BaseDal.DeleteEntityAsync(where);
-        }
-
         /// <summary>
         /// 删除实体并保存
         /// </summary>
@@ -808,17 +514,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return SaveChanges() > 0;
         }
 
-        /// <summary>
-        /// 删除实体并保存(异步)
-        /// </summary>
-        /// <param name="t">需要删除的实体</param>
-        /// <returns>删除成功</returns>
-        public virtual Task<int> DeleteEntitySavedAsync(T t)
-        {
-            BaseDal.DeleteEntity(t);
-            return SaveChangesAsync();
-        }
-
         /// <summary>
         /// 添加实体
         /// </summary>
@@ -840,17 +535,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.AddOrUpdate(key, t);
         }
 
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="entities">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        public void AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, params T[] entities)
-        {
-            BaseDal.AddOrUpdate(key, entities);
-        }
-
         /// <summary>
         /// 添加或更新实体
         /// </summary>
@@ -874,31 +558,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return b ? entity : null;
         }
 
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="t">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        public T AddOrUpdateSaved<TKey>(Expression<Func<T, TKey>> key, T t)
-        {
-            BaseDal.AddOrUpdate(key, t);
-            var b = BaseDal.SaveChanges() > 0;
-            return b ? t : null;
-        }
-
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="entities">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        public bool AddOrUpdateSaved<TKey>(Expression<Func<T, TKey>> key, params T[] entities)
-        {
-            AddOrUpdate(key, entities);
-            return SaveChanges() > 0;
-        }
-
         /// <summary>
         /// 添加或更新实体
         /// </summary>
@@ -982,17 +641,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.DeleteEntities(list);
         }
 
-        /// <summary>
-        /// 删除多个实体并保存
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>删除成功</returns>
-        public virtual bool DeleteEntitiesSaved(IEnumerable<T> list)
-        {
-            BaseDal.DeleteEntities(list);
-            return SaveChanges() > 0;
-        }
-
         /// <summary>
         /// 删除多个实体并保存(异步)
         /// </summary>
@@ -1004,30 +652,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return SaveChangesAsync();
         }
 
-        /// <summary>
-        /// 添加多个实体并保存
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>添加成功</returns>
-        public virtual IEnumerable<T> AddEntities(IList<T> list)
-        {
-            IEnumerable<T> entities = BaseDal.AddEntities(list);
-            SaveChanges();
-            return entities;
-        }
-
-        /// <summary>
-        /// 添加多个实体并保存(异步)
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>添加成功</returns>
-        public virtual async Task<IEnumerable<T>> AddEntitiesAsync(IList<T> list)
-        {
-            IEnumerable<T> entities = BaseDal.AddEntities(list);
-            await SaveChangesAsync();
-            return entities;
-        }
-
         public virtual T this[int id]
         {
             get => GetById(id);

+ 8 - 295
src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/IBaseService.cs

@@ -19,18 +19,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         IQueryable<T> GetAllNoTracking();
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns></returns>
-        IEnumerable<T> GetAllFromCache();
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns></returns>
-        Task<List<T>> GetAllFromCacheAsync();
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -38,20 +26,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         IQueryable<TDto> GetAll<TDto>() where TDto : class;
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <returns></returns>
-        IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class;
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <returns></returns>
-        Task<List<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class;
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -77,16 +51,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns></returns>
-        IEnumerable<T> GetAllFromCache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        Task<List<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        PooledList<T> GetAllFromCache<TS>(Expression<Func<T, TS>> orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取所有实体Dto
@@ -98,26 +63,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         IQueryable<TDto> GetAll<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
-        /// <summary>
-        /// 从二级缓存获取所有实体Dto
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        IEnumerable<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
-
-        /// <summary>
-        /// 从二级缓存获取所有实体Dto
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        Task<List<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
-
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
@@ -161,13 +106,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns></returns>
         IEnumerable<T> GetQueryFromCache(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns></returns>
-        Task<List<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where);
-
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
         /// </summary>
@@ -178,41 +116,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns></returns>
         IEnumerable<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
-        /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        Task<List<T>> GetQueryFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns></returns>
-        IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns></returns>
-        Task<List<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
-
-        /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
-        /// <typeparam name="TDto">输出类型</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns></returns>
-        IEnumerable<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
-
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
@@ -222,7 +125,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns></returns>
-        Task<List<TDto>> GetQueryFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        PooledList<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
@@ -248,13 +151,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>实体</returns>
         T Get(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 从二级缓存获取第一条数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        T GetFromCache(Expression<Func<T, bool>> @where);
-
         /// <summary>
         /// 从二级缓存获取第一条数据
         /// </summary>
@@ -272,26 +168,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>实体</returns>
         T Get<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
-        /// <summary>
-        /// 从二级缓存获取第一条数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        T GetFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <summary>
-        /// 获取第一条数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        Task<T> GetFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -299,20 +175,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>实体</returns>
         TDto Get<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        TDto GetFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
-
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        Task<TDto> GetFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
-
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -335,17 +197,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>映射实体</returns>
         Task<TDto> GetAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
-        /// <summary>
-        /// 从二级缓存获取第一条被AutoMapper映射后的数据
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <typeparam name="TDto">映射实体</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>映射实体</returns>
-        TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
-
         /// <summary>
         /// 从二级缓存获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -381,33 +232,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>实体</returns>
         T GetNoTracking(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 获取第一条数据(不跟踪实体)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        T GetNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <summary>
-        /// 获取第一条数据(异步,不跟踪实体)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>实体</returns>
-        Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> @where);
-
-        /// <summary>
-        /// 获取第一条数据(异步,不跟踪实体)
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>实体</returns>
-        Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
         /// <summary>
         /// 根据ID找实体
         /// </summary>
@@ -423,7 +247,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         Task<T> GetByIdAsync(int id);
 
         /// <summary>
-        /// 高效分页查询方法
+        /// 标准分页查询方法
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -435,7 +259,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         PagedList<T> GetPages<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc);
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -448,7 +272,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         PagedList<TDto> GetPages<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class;
 
         /// <summary>
-        /// 高效分页查询方法
+        /// 标准分页查询方法
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -460,7 +284,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         Task<PagedList<T>> GetPagesAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc);
 
         /// <summary>
-        /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -473,31 +297,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         Task<PagedList<TDto>> GetPagesAsync<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class;
 
         /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        PagedList<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc);
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        Task<PagedList<T>> GetPagesFromCacheAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc);
-
-        /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
+        /// 标准分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <typeparam name="TDto"></typeparam>
@@ -510,20 +310,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         PagedList<TDto> GetPagesFromCache<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class;
 
         /// <summary>
-        /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
-        /// </summary>
-        /// <typeparam name="TS"></typeparam>
-        /// <typeparam name="TDto"></typeparam>
-        /// <param name="pageIndex">第几页</param>
-        /// <param name="pageSize">每页大小</param>
-        /// <param name="where">where Lambda条件表达式</param>
-        /// <param name="orderby">orderby Lambda条件表达式</param>
-        /// <param name="isAsc">升序降序</param>
-        /// <returns></returns>
-        Task<PagedList<TDto>> GetPagesFromCacheAsync<TS, TDto>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class;
-
-        /// <summary>
-        /// 高效分页查询方法(不跟踪实体)
+        /// 标准分页查询方法(不跟踪实体)
         /// </summary>
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
@@ -576,13 +363,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>删除成功</returns>
         Task<int> DeleteEntitySavedAsync(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 根据条件删除实体(异步)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <returns>删除成功</returns>
-        Task<int> DeleteEntityAsync(Expression<Func<T, bool>> @where);
-
         /// <summary>
         /// 删除实体并保存
         /// </summary>
@@ -590,13 +370,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>删除成功</returns>
         bool DeleteEntitySaved(T t);
 
-        /// <summary>
-        /// 删除实体并保存(异步)
-        /// </summary>
-        /// <param name="t">需要删除的实体</param>
-        /// <returns>删除成功</returns>
-        Task<int> DeleteEntitySavedAsync(T t);
-
         /// <summary>
         /// 添加实体
         /// </summary>
@@ -604,22 +377,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>添加成功</returns>
         T AddEntity(T t);
 
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="t">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        T AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, T t);
-
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="entities">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        void AddOrUpdate<TKey>(Expression<Func<T, TKey>> key, params T[] entities);
-
         /// <summary>
         /// 添加或更新实体
         /// </summary>
@@ -635,22 +392,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>添加成功</returns>
         T AddEntitySaved(T t);
 
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="t">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        T AddOrUpdateSaved<TKey>(Expression<Func<T, TKey>> key, T t);
-
-        /// <summary>
-        /// 添加或更新实体
-        /// </summary>
-        /// <param name="key">更新键规则</param>
-        /// <param name="entities">需要保存的实体</param>
-        /// <returns>保存成功</returns>
-        bool AddOrUpdateSaved<TKey>(Expression<Func<T, TKey>> key, params T[] entities);
-
         /// <summary>
         /// 添加或更新实体
         /// </summary>
@@ -700,20 +441,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns></returns>
         int Count(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 删除多个实体
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>删除成功</returns>
-        bool DeleteEntities(IEnumerable<T> list);
-
-        /// <summary>
-        /// 删除多个实体并保存
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>删除成功</returns>
-        bool DeleteEntitiesSaved(IEnumerable<T> list);
-
         /// <summary>
         /// 删除多个实体并保存(异步)
         /// </summary>
@@ -721,20 +448,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>删除成功</returns>
         Task<int> DeleteEntitiesSavedAsync(IEnumerable<T> list);
 
-        /// <summary>
-        /// 添加多个实体并保存
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>添加成功</returns>
-        IEnumerable<T> AddEntities(IList<T> list);
-
-        /// <summary>
-        /// 添加多个实体并保存(异步)
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>添加成功</returns>
-        Task<IEnumerable<T>> AddEntitiesAsync(IList<T> list);
-
         T this[int id] => GetById(id);
 
         string this[int id, Expression<Func<T, string>> selector] => GetQuery(t => t.Id == id).Select(selector).FirstOrDefault();

+ 3 - 25
src/Masuit.MyBlogs.Core/Infrastructure/Services/PostService.cs

@@ -4,7 +4,6 @@ using AngleSharp.Html.Parser;
 using AutoMapper;
 using CacheManager.Core;
 using Collections.Pooled;
-using EFCoreSecondLevelCacheInterceptor;
 using Masuit.LuceneEFCore.SearchEngine;
 using Masuit.LuceneEFCore.SearchEngine.Interfaces;
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
@@ -21,6 +20,7 @@ using PanGu.HighLight;
 using System.Linq.Expressions;
 using System.Reflection;
 using System.Text.RegularExpressions;
+using Z.EntityFramework.Plus;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Services
 {
@@ -120,7 +120,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public void SolvePostsCategory(IList<PostDto> posts)
         {
             var cids = posts.Select(p => p.CategoryId).Distinct().ToArray();
-            var categories = _categoryRepository.GetQuery(c => cids.Contains(c.Id)).Include(c => c.Parent).Cacheable().ToDictionary(c => c.Id);
+            var categories = _categoryRepository.GetQuery(c => cids.Contains(c.Id)).Include(c => c.Parent).ToDictionary(c => c.Id);
             posts.ForEach(p => p.Category = _mapper.Map<CategoryDto_P>(categories[p.CategoryId]));
         }
 
@@ -196,7 +196,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         public Dictionary<string, int> GetTags()
         {
-            return _postTagsRepository.GetAll(t => t.Count, false).Cacheable().ToDictionary(g => g.Name, g => g.Count);
+            return _postTagsRepository.GetAll(t => t.Count, false).FromCache().ToDictionary(g => g.Name, g => g.Count);
         }
 
         /// <summary>
@@ -233,17 +233,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return SearchEngine.SaveChanges() > 0;
         }
 
-        /// <summary>
-        /// 删除多个实体并保存
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>删除成功</returns>
-        public override bool DeleteEntitiesSaved(IEnumerable<Post> list)
-        {
-            base.DeleteEntities(list);
-            return SearchEngine.SaveChanges() > 0;
-        }
-
         /// <summary>
         /// 根据ID删除实体并保存(异步)
         /// </summary>
@@ -299,17 +288,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return SearchEngine.SaveChangesAsync();
         }
 
-        /// <summary>
-        /// 删除实体并保存(异步)
-        /// </summary>
-        /// <param name="t">需要删除的实体</param>
-        /// <returns>删除成功</returns>
-        public override Task<int> DeleteEntitySavedAsync(Post t)
-        {
-            base.DeleteEntity(t);
-            return SearchEngine.SaveChangesAsync();
-        }
-
         /// <summary>
         /// 统一保存的方法
         /// </summary>

+ 0 - 1
src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.csproj

@@ -47,7 +47,6 @@
         <PackageReference Include="CHTCHSConv" Version="1.0.0" />
         <PackageReference Include="CLRStats" Version="1.0.0" />
         <PackageReference Include="Collections.Pooled" Version="1.0.82" />
-        <PackageReference Include="EFCoreSecondLevelCacheInterceptor" Version="3.7.0" />
         <PackageReference Include="FreeRedis" Version="1.0.2" />
         <PackageReference Include="Hangfire" Version="1.7.31" />
         <PackageReference Include="Hangfire.MemoryStorage" Version="1.7.0" />

+ 6 - 0
src/Masuit.MyBlogs.Core/Program.cs

@@ -6,8 +6,14 @@ using Masuit.MyBlogs.Core.Infrastructure;
 using Masuit.MyBlogs.Core.Infrastructure.Drive;
 using Masuit.Tools;
 using Microsoft.AspNetCore.Server.Kestrel.Core;
+using Microsoft.Extensions.Caching.Memory;
 using System.Diagnostics;
+using Z.EntityFramework.Plus;
 
+QueryCacheManager.DefaultMemoryCacheEntryOptions = new MemoryCacheEntryOptions()
+{
+    AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5)
+};
 AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
 
 if (Environment.OSVersion.Platform is not (PlatformID.MacOSX or PlatformID.Unix))

+ 1 - 3
src/Masuit.MyBlogs.Core/Startup.cs

@@ -1,6 +1,5 @@
 using Autofac;
 using CLRStats;
-using EFCoreSecondLevelCacheInterceptor;
 using FreeRedis;
 using Hangfire;
 using Hangfire.MemoryStorage;
@@ -83,8 +82,7 @@ namespace Masuit.MyBlogs.Core
         /// <returns></returns>
         public void ConfigureServices(IServiceCollection services)
         {
-            services.AddEFSecondLevelCache(options => options.UseCustomCacheProvider<EFCacheManagerCoreProvider>(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(5)).DisableLogging(true).UseCacheKeyPrefix("EFCore:"));
-            services.AddDbContext<DataContext>((serviceProvider, opt) => opt.UseNpgsql(AppConfig.ConnString, builder => builder.EnableRetryOnFailure(10)).AddInterceptors(serviceProvider.GetRequiredService<SecondLevelCacheInterceptor>()).EnableSensitiveDataLogging()); //配置数据库
+            services.AddDbContext<DataContext>((serviceProvider, opt) => opt.UseNpgsql(AppConfig.ConnString, builder => builder.EnableRetryOnFailure(10)).EnableSensitiveDataLogging()); //配置数据库
             services.AddDbContext<LoggerDbContext>(opt => opt.UseNpgsql(AppConfig.ConnString)); //配置数据库
             services.ConfigureOptions();
             services.AddHttpsRedirection(options =>

+ 5 - 5
src/Masuit.MyBlogs.Core/Views/Home/Category.cshtml

@@ -5,9 +5,9 @@
 @using Masuit.MyBlogs.Core.Common
 @using Masuit.MyBlogs.Core.Infrastructure.Services.Interface
 @using Masuit.MyBlogs.Core.Models.Enum
-@using EFCoreSecondLevelCacheInterceptor
 @using Masuit.Tools.Models
 @using Collections.Pooled
+@using Z.EntityFramework.Plus
 @model Masuit.MyBlogs.Core.Models.ViewModel.HomePageViewModel
 @inject ICategoryService CategoryService
 @{
@@ -23,16 +23,16 @@
             children2.AddRange(cat.Children.Where(c => c.Status == Status.Available).OrderBy(c => c.Id).ToPooledList());
             break;
         case 2:
-            children2.AddRange(CategoryService.GetQuery(c => c.Status == Status.Available && c.ParentId == parentId, c => c.Name).Cacheable().ToPooledList());
+            children2.AddRange(CategoryService.GetQuery(c => c.Status == Status.Available && c.ParentId == parentId, c => c.Name).FromCache().ToPooledList());
             children3.AddRange(cat.Children.Where(c => c.Status == Status.Available).OrderBy(c => c.Id).ToPooledList());
             break;
         case 3:
             var topid = cat.Parent.ParentId;
-            children2.AddRange(CategoryService.GetQuery(c => c.Status == Status.Available && c.ParentId == topid, c => c.Name).Cacheable().ToPooledList());
-            children3.AddRange(CategoryService.GetQuery(c => c.Status == Status.Available && c.ParentId == parentId, c => c.Name).Cacheable().ToPooledList());
+            children2.AddRange(CategoryService.GetQuery(c => c.Status == Status.Available && c.ParentId == topid, c => c.Name).FromCache().ToPooledList());
+            children3.AddRange(CategoryService.GetQuery(c => c.Status == Status.Available && c.ParentId == parentId, c => c.Name).FromCache().ToPooledList());
             break;
     }
-    var alllist = CategoryService.GetQuery(c => c.Status == Status.Available && c.ParentId == null, c => c.Name).Select(c => new{c.Id,c.Name}).Cacheable().ToPooledList();
+    var alllist = CategoryService.GetQuery(c => c.Status == Status.Available && c.ParentId == null, c => c.Name).Select(c => new{c.Id,c.Name}).FromCache().ToPooledList();
 }
 <style>
     .bg-title {

+ 2 - 1
src/Masuit.MyBlogs.Core/Views/Home/Index.cshtml

@@ -1,4 +1,5 @@
 @using System.Diagnostics
+@using Collections.Pooled
 @using Masuit.MyBlogs.Core.Common
 @using Masuit.MyBlogs.Core.Models.DTO
 @using Masuit.MyBlogs.Core.Models.Entity
@@ -9,7 +10,7 @@
 @{
     ViewBag.Title = "首页";
     Layout = "~/Views/Shared/_Layout.cshtml";
-    List<FastShare> shares = ViewBag.FastShare;
+    PooledList<FastShare> shares = ViewBag.FastShare;
     Context.Request.Path = new PathString("/posts");
 }
 <link href="~/Assets/banner/bootstrap-touch-slider.css" rel="stylesheet" />

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Links/Index.cshtml

@@ -1,6 +1,6 @@
 @using Masuit.MyBlogs.Core.Models.DTO
 @using Masuit.MyBlogs.Core.Models.Entity
-@model IEnumerable<Masuit.MyBlogs.Core.Models.DTO.LinksDto>
+@model Collections.Pooled.PooledList<Masuit.MyBlogs.Core.Models.DTO.LinksDto>
 
 @{
     ViewBag.Title = "友情链接大全";

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Links/Index_Admin.cshtml

@@ -1,6 +1,6 @@
 @using Masuit.MyBlogs.Core.Models.DTO
 @using Masuit.MyBlogs.Core.Models.Entity
-@model IEnumerable<Masuit.MyBlogs.Core.Models.DTO.LinksDto>
+@model Collections.Pooled.PooledList<Masuit.MyBlogs.Core.Models.DTO.LinksDto>
 
 @{
     ViewBag.Title = "友情链接大全";

+ 2 - 2
src/Masuit.MyBlogs.Core/Views/Shared/_Layout.cshtml

@@ -9,19 +9,19 @@
 @using Masuit.MyBlogs.Core.Views.Shared
 @using Masuit.Tools
 @using Masuit.Tools.Core.Net
-@using EFCoreSecondLevelCacheInterceptor
 @using Masuit.Tools.Models
 @using Microsoft.AspNetCore.Http.Extensions
 @using Microsoft.AspNetCore.Mvc.TagHelpers
 @using StackExchange.Profiling
 @using Collections.Pooled
 @using Masuit.Tools.AspNetCore.Extensions
+@using Z.EntityFramework.Plus
 
 @{
     string[] colors = { "success", "info", "warning", "danger", "default" };
     List<Menu> menus = _menuService.GetQueryFromCache(m => m.Status == Status.Available,m => m.Sort).ToPooledList().ToTree(m => m.Id,m => m.ParentId);
     var user = Context.Session.Get<UserInfoDto>(SessionKey.UserInfo) ?? new UserInfoDto();
-    using var links = _linksService.GetQuery(l => l.Status == Status.Available).OrderByDescending(l => l.Recommend).ThenByDescending(l => l.Loopbacks.GroupBy(x => x.IP).Count()).Take(30).Select(e => new{e.Url,e.Name}).Cacheable().ToPooledList();
+    using var links = _linksService.GetQuery(l => l.Status == Status.Available).OrderByDescending(l => l.Recommend).ThenByDescending(l => l.Loopbacks.GroupBy(x => x.IP).Count()).Take(30).Select(e => new{e.Url,e.Name}).FromCache().ToPooledList();
 }
 
 <!DOCTYPE html>

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/analysis.js

@@ -19,7 +19,7 @@
 		currentPage:1,
 		itemsPerPage:10,
 		pagesLength:25,
-		perPageOptions:[1, 5, 10, 15, 20, 30, 40, 50],
+		perPageOptions:[10, 15, 20, 30, 50, 100, 200],
 		rememberPerPage:'perPageItems',
 		onChange:function() {
 			if(_timeout) {

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/comment.js

@@ -5,7 +5,7 @@
 		//totalItems: $scope.total,
 		itemsPerPage: 10,
 		pagesLength: 25,
-		perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+		perPageOptions: [10, 15, 20, 30, 50, 100, 200],
 		rememberPerPage: 'perPageItems',
 		onChange: function () {
 			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/donate.js

@@ -4,7 +4,7 @@
         currentPage: 1,
         itemsPerPage: 10,
         pagesLength: 25,
-        perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+        perPageOptions: [10, 15, 20, 30, 50, 100, 200],
         rememberPerPage: 'perPageItems',
         onChange: function() {
             self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/merge.js

@@ -6,7 +6,7 @@
 		currentPage: $scope.currentPage ? $scope.currentPage : 1,
 		itemsPerPage: 10,
 		pagesLength: 25,
-		perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+		perPageOptions: [10, 15, 20, 30, 50, 100, 200],
 		rememberPerPage: 'perPageItems',
 		onChange: function() {
 			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/misc.js

@@ -45,7 +45,7 @@ myApp.controller("miscList", ["$scope", "$http", "NgTableParams", function ($sco
 		//totalItems: $scope.total,
 		itemsPerPage: 10,
 		pagesLength: 25,
-		perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+		perPageOptions: [10, 15, 20, 30, 50, 100, 200],
 		rememberPerPage: 'perPageItems',
 		onChange: function () {
 			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 2 - 2
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/msg.js

@@ -5,7 +5,7 @@
 		currentPage: $scope.currentPage ||1,
 		itemsPerPage: 10,
 		pagesLength: 25,
-		perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+		perPageOptions: [10, 15, 20, 30, 50, 100, 200],
 		rememberPerPage: 'perPageItems',
 		onChange: function () {
 			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);
@@ -73,7 +73,7 @@ myApp.controller("msgs", ["$scope", "$http", function ($scope, $http) {
 		currentPage: $scope.currentPage || 1,
 		itemsPerPage: 10,
 		pagesLength: 25,
-		perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+		perPageOptions: [10, 15, 20, 30, 50, 100, 200],
 		rememberPerPage: 'perPageItems',
 		onChange: function () {
 			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/notice.js

@@ -70,7 +70,7 @@ myApp.controller("noticeList", ["$scope", "$http", "NgTableParams", function ($s
         //totalItems: $scope.total,
         itemsPerPage: 10,
         pagesLength: 25,
-        perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+        perPageOptions: [10, 15, 20, 30, 50, 100, 200],
         rememberPerPage: 'perPageItems',
         onChange: function () {
             self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/partner.js

@@ -8,7 +8,7 @@
         currentPage: 1,
         itemsPerPage: 10,
         pagesLength: 25,
-        perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+        perPageOptions: [10, 15, 20, 30, 50, 100, 200],
         rememberPerPage: 'perPageItems',
         onChange: function () {
             self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 2 - 2
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/post.js

@@ -9,7 +9,7 @@
         currentPage:  1,
         itemsPerPage: 10,
         pagesLength: 25,
-        perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+        perPageOptions: [10, 15, 20, 30, 50, 100, 200],
         rememberPerPage: 'perPageItems',
         onChange: function() {
             self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);
@@ -1340,7 +1340,7 @@ myApp.controller("postpending", ["$scope", "$http", "NgTableParams", "$timeout",
         //totalItems: $scope.total,
         itemsPerPage: 10,
         pagesLength: 25,
-        perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+        perPageOptions: [10, 15, 20, 30, 50, 100, 200],
         rememberPerPage: 'perPageItems',
         onChange: function() {
             self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/seminar.js

@@ -4,7 +4,7 @@
 		currentPage: $scope.currentPage ? $scope.currentPage : 1,
 		itemsPerPage: 10,
 		pagesLength: 25,
-		perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+		perPageOptions: [10, 15, 20, 30, 50, 100, 200],
 		rememberPerPage: 'perPageItems',
 		onChange: function () {
 			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/users.js

@@ -8,7 +8,7 @@
 		currentPage:  1,
 		itemsPerPage: 10,
 		pagesLength: 25,
-		perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
+		perPageOptions: [10, 15, 20, 30, 50, 100, 200],
 		rememberPerPage: 'perPageItems',
 		onChange: function() {
 			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);