Browse Source

异步化

懒得勤快 5 năm trước cách đây
mục cha
commit
ca27aea213
30 tập tin đã thay đổi với 1000 bổ sung319 xóa
  1. 7 6
      src/Masuit.MyBlogs.Core/Controllers/AdvertisementController.cs
  2. 2 2
      src/Masuit.MyBlogs.Core/Controllers/CategoryController.cs
  3. 1 1
      src/Masuit.MyBlogs.Core/Controllers/CommentController.cs
  4. 22 22
      src/Masuit.MyBlogs.Core/Controllers/HomeController.cs
  5. 24 24
      src/Masuit.MyBlogs.Core/Controllers/LinksController.cs
  6. 6 5
      src/Masuit.MyBlogs.Core/Controllers/LoginController.cs
  7. 7 7
      src/Masuit.MyBlogs.Core/Controllers/MenuController.cs
  8. 20 20
      src/Masuit.MyBlogs.Core/Controllers/MergeController.cs
  9. 11 9
      src/Masuit.MyBlogs.Core/Controllers/MiscController.cs
  10. 18 17
      src/Masuit.MyBlogs.Core/Controllers/MsgController.cs
  11. 11 11
      src/Masuit.MyBlogs.Core/Controllers/NoticeController.cs
  12. 59 67
      src/Masuit.MyBlogs.Core/Controllers/PostController.cs
  13. 5 4
      src/Masuit.MyBlogs.Core/Controllers/SearchController.cs
  14. 18 17
      src/Masuit.MyBlogs.Core/Controllers/SeminarController.cs
  15. 6 5
      src/Masuit.MyBlogs.Core/Controllers/ShareController.cs
  16. 17 16
      src/Masuit.MyBlogs.Core/Controllers/SubscribeController.cs
  17. 12 10
      src/Masuit.MyBlogs.Core/Controllers/SystemController.cs
  18. 5 5
      src/Masuit.MyBlogs.Core/Controllers/UploadController.cs
  19. 9 9
      src/Masuit.MyBlogs.Core/Controllers/UserController.cs
  20. 6 5
      src/Masuit.MyBlogs.Core/Controllers/ValidateController.cs
  21. 257 46
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/BaseRepository.cs
  22. 138 3
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/Interface/IBaseRepository.cs
  23. 183 0
      src/Masuit.MyBlogs.Core/Infrastructure/Services/BaseService.cs
  24. 5 4
      src/Masuit.MyBlogs.Core/Infrastructure/Services/CategoryService.cs
  25. 138 0
      src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/IBaseService.cs
  26. 2 1
      src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/ICategoryService.cs
  27. 8 0
      src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.csproj
  28. 1 1
      src/Masuit.MyBlogs.Core/Views/Links/Index.cshtml
  29. 1 1
      src/Masuit.MyBlogs.Core/Views/Links/Index_Admin.cshtml
  30. 1 1
      src/Masuit.MyBlogs.Core/Views/Post/Publish.cshtml

+ 7 - 6
src/Masuit.MyBlogs.Core/Controllers/AdvertisementController.cs

@@ -10,6 +10,7 @@ using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.MyBlogs.Core.Models.ViewModel;
 using Masuit.Tools.Core.Net;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
 using System;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
@@ -47,7 +48,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult GetPageData([Range(1, int.MaxValue, ErrorMessage = "页数必须大于0")] int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")] int size = 10, string kw = "")
+        public async Task<ActionResult> GetPageData([Range(1, int.MaxValue, ErrorMessage = "页数必须大于0")] int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")] int size = 10, string kw = "")
         {
             Expression<Func<Advertisement, bool>> where = p => true;
             if (!string.IsNullOrEmpty(kw))
@@ -55,9 +56,9 @@ namespace Masuit.MyBlogs.Core.Controllers
                 where = where.And(p => p.Title.Contains(kw) || p.Description.Contains(kw));
             }
 
-            var list = AdsService.GetQuery(where).OrderByDescending(p => p.Price).ThenByDescending(a => a.Weight).ToPagedList<Advertisement, AdvertisementViewModel>(page, size, MapperConfig);
+            var list = await AdsService.GetQuery(where).OrderByDescending(p => p.Price).ThenByDescending(a => a.Weight).ToCachedPagedListAsync<Advertisement, AdvertisementViewModel>(page, size, MapperConfig);
             var cids = list.Data.Where(m => !string.IsNullOrEmpty(m.CategoryIds)).SelectMany(m => m.CategoryIds.Split(",", StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)).Distinct().ToArray();
-            var dic = CategoryService.GetQuery(c => cids.Contains(c.Id)).ToDictionary(c => c.Id + "", c => c.Name);
+            var dic = await CategoryService.GetQuery(c => cids.Contains(c.Id)).ToDictionaryAsync(c => c.Id + "", c => c.Name);
             foreach (var ad in list.Data.Where(ad => !string.IsNullOrEmpty(ad.CategoryIds)))
             {
                 ad.CategoryNames = ad.CategoryIds.Split(",").Select(c => dic.GetValueOrDefault(c)).Join(",");
@@ -100,11 +101,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id">文章id</param>
         /// <returns></returns>
         [MyAuthorize, HttpPost("{id}")]
-        public ActionResult ChangeState(int id)
+        public async Task<ActionResult> ChangeState(int id)
         {
-            var ad = AdsService.GetById(id) ?? throw new NotFoundException("广告不存在!");
+            var ad = await AdsService.GetByIdAsync(id) ?? throw new NotFoundException("广告不存在!");
             ad.Status = ad.Status == Status.Available ? Status.Unavailable : Status.Available;
-            return ResultData(null, AdsService.SaveChanges() > 0, ad.Status == Status.Available ? $"【{ad.Title}】已上架!" : $"【{ad.Title}】已下架!");
+            return ResultData(null, await AdsService.SaveChangesAsync() > 0, ad.Status == Status.Available ? $"【{ad.Title}】已上架!" : $"【{ad.Title}】已下架!");
         }
     }
 }

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

@@ -85,9 +85,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <param name="cid"></param>
         /// <returns></returns>
-        public ActionResult Delete(int id, int cid = 1)
+        public async Task<ActionResult> Delete(int id, int cid = 1)
         {
-            bool b = CategoryService.Delete(id, cid);
+            bool b = await CategoryService.Delete(id, cid);
             return ResultData(null, b, b ? "分类删除成功" : "分类删除失败");
         }
     }

+ 1 - 1
src/Masuit.MyBlogs.Core/Controllers/CommentController.cs

@@ -212,7 +212,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 return ResultData(null, false, "没有评论");
             }
             total = parent.TotalCount;
-            var result = parent.Data.SelectMany(c => CommentService.GetSelfAndAllChildrenCommentsByParentId(c.Id).Where(x => (x.Status == Status.Published || CurrentUser.IsAdmin))).Select(c =>
+            var result = parent.Data.SelectMany(c => CommentService.GetSelfAndAllChildrenCommentsByParentId(c.Id).Where(x => x.Status == Status.Published || CurrentUser.IsAdmin)).Select(c =>
             {
                 c.CommentDate = c.CommentDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
                 return c;

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

@@ -51,17 +51,17 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [HttpGet, ResponseCache(Duration = 600, VaryByHeader = "Cookie", Location = ResponseCacheLocation.Any)]
-        public ActionResult Index()
+        public async Task<ActionResult> Index()
         {
             var banners = AdsService.GetsByWeightedPrice(8, AdvertiseType.Banner).OrderBy(a => Guid.NewGuid()).ToList();
-            var fastShares = FastShareService.GetAllFromCache(s => s.Sort).ToList();
+            var fastShares = await FastShareService.GetAllFromCacheAsync(s => s.Sort);
             var postsQuery = PostService.GetQuery<PostDto>(p => (p.Status == Status.Published || CurrentUser.IsAdmin)); //准备文章的查询
-            var posts = postsQuery.Where(p => !p.IsFixedTop).OrderBy(OrderBy.ModifyDate.GetDisplay() + " desc").ToCachedPagedList(1, 15);
+            var posts = await postsQuery.Where(p => !p.IsFixedTop).OrderBy(OrderBy.ModifyDate.GetDisplay() + " desc").ToCachedPagedListAsync(1, 15);
             posts.Data.InsertRange(0, postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate).ToList());
-            var viewModel = GetIndexPageViewModel();
+            var viewModel = await GetIndexPageViewModel();
             viewModel.Banner = banners;
             viewModel.Posts = posts;
-            ViewBag.FastShare = fastShares;
+            ViewBag.FastShare = fastShares.ToList();
             viewModel.PageParams = new Pagination(1, 15, posts.TotalCount, OrderBy.ModifyDate);
             return View(viewModel);
         }
@@ -74,11 +74,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="orderBy"></param>
         /// <returns></returns>
         [Route("p"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
-        public ActionResult Post([Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")]int size = 15)
+        public async Task<ActionResult> Post([Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
-            var viewModel = GetIndexPageViewModel();
+            var viewModel = await GetIndexPageViewModel();
             var postsQuery = PostService.GetQuery<PostDto>(p => (p.Status == Status.Published || CurrentUser.IsAdmin)); //准备文章的查询
-            var posts = postsQuery.Where(p => !p.IsFixedTop).OrderBy((orderBy ?? OrderBy.ModifyDate).GetDisplay() + " desc").ToCachedPagedList(page, size);
+            var posts = await postsQuery.Where(p => !p.IsFixedTop).OrderBy((orderBy ?? OrderBy.ModifyDate).GetDisplay() + " desc").ToCachedPagedListAsync(page, size);
             if (page == 1)
             {
                 posts.Data.InsertRange(0, postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate).ToList());
@@ -98,10 +98,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="orderBy"></param>
         /// <returns></returns>
         [Route("tag/{id}/{page:int?}/{size:int?}/{orderBy:int?}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id", "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
-        public ActionResult Tag(string id, [Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")]int size = 15)
+        public async Task<ActionResult> Tag(string id, [Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
-            var posts = PostService.GetQuery<PostDto>(p => p.Label.Contains(id) && (p.Status == Status.Published || CurrentUser.IsAdmin)).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedList(page, size);
-            var viewModel = GetIndexPageViewModel();
+            var posts = await PostService.GetQuery<PostDto>(p => p.Label.Contains(id) && (p.Status == Status.Published || CurrentUser.IsAdmin)).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync(page, size);
+            var viewModel = await GetIndexPageViewModel();
             ViewBag.Tag = id;
             viewModel.Posts = posts;
             viewModel.PageParams = new Pagination(page, size, posts.TotalCount, orderBy);
@@ -117,12 +117,12 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="orderBy"></param>
         /// <returns></returns>
         [Route("author/{author}/{page:int?}/{size:int?}/{orderBy:int?}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "author", "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
-        public ActionResult Author(string author, [Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")]int size = 15)
+        public async Task<ActionResult> Author(string author, [Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
             Expression<Func<Post, bool>> where = p => p.Author.Equals(author) || p.Modifier.Equals(author) || p.Email.Equals(author) || p.PostHistoryVersion.Any(v => v.Modifier.Equals(author) || v.ModifierEmail.Equals(author));
             where = where.And(p => p.Status == Status.Published || CurrentUser.IsAdmin);
             var posts = PostService.GetQuery<PostDto>(where).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedList(page, size);
-            var viewModel = GetIndexPageViewModel();
+            var viewModel = await GetIndexPageViewModel();
             ViewBag.Author = author;
             ViewBag.Total = posts.TotalCount;
             viewModel.Posts = posts;
@@ -140,11 +140,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         [Route("cat/{id:int}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id", "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
         [Route("cat/{id:int}/{page:int?}/{size:int?}/{orderBy:int?}")]
-        public async Task<ActionResult> Category(int id, [Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")]int size = 15)
+        public async Task<ActionResult> Category(int id, [Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
             var cat = await CategoryService.GetByIdAsync(id) ?? throw new NotFoundException("文章分类未找到");
             var posts = PostService.GetQuery<PostDto>(p => p.CategoryId == cat.Id && (p.Status == Status.Published || CurrentUser.IsAdmin)).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedList(page, size);
-            var viewModel = GetIndexPageViewModel();
+            var viewModel = await GetIndexPageViewModel();
             viewModel.Posts = posts;
             ViewBag.Category = cat;
             viewModel.PageParams = new Pagination(page, size, posts.TotalCount, orderBy);
@@ -155,18 +155,18 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// 获取页面视图模型
         /// </summary>
         /// <returns></returns>
-        private HomePageViewModel GetIndexPageViewModel()
+        private async Task<HomePageViewModel> GetIndexPageViewModel()
         {
             var postsQuery = PostService.GetQuery<PostDto>(p => (p.Status == Status.Published || CurrentUser.IsAdmin)); //准备文章的查询
-            var notices = NoticeService.GetPagesFromCache<DateTime, NoticeDto>(1, 5, n => (n.Status == Status.Display || CurrentUser.IsAdmin), n => n.ModifyDate, false); //加载前5条公告
-            var cats = CategoryService.GetQueryFromCache<string, CategoryDto>(c => c.Status == Status.Available, c => c.Name).ToList(); //加载分类目录
+            var notices = await NoticeService.GetPagesFromCacheAsync<DateTime, NoticeDto>(1, 5, n => (n.Status == Status.Display || CurrentUser.IsAdmin), n => n.ModifyDate, false); //加载前5条公告
+            var cats = await CategoryService.GetQueryFromCacheAsync<string, CategoryDto>(c => c.Status == Status.Available, c => c.Name); //加载分类目录
             var hotSearches = RedisHelper.Get<List<KeywordsRank>>("SearchRank:Week").Take(10).ToList(); //热词统计
-            var hot6Post = postsQuery.OrderBy((new Random().Next() % 3) switch
+            var hot6Post = await postsQuery.OrderBy((new Random().Next() % 3) switch
             {
                 1 => nameof(OrderBy.VoteUpCount),
                 2 => nameof(OrderBy.AverageViewCount),
                 _ => nameof(OrderBy.TotalViewCount)
-            } + " desc").Skip(0).Take(5).FromCache().ToList(); //热门文章
+            } + " desc").Skip(0).Take(5).FromCacheAsync(); //热门文章
             var newdic = new Dictionary<string, int>(); //标签云最终结果
             var tagdic = postsQuery.Where(p => !string.IsNullOrEmpty(p.Label)).Select(p => p.Label).Distinct().FromCache().ToList().SelectMany(s => s.Split(',', ',')).GroupBy(s => s).ToDictionary(g => g.Key, g => g.Count()); //统计标签
 
@@ -182,11 +182,11 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             return new HomePageViewModel()
             {
-                Categories = cats,
+                Categories = cats.ToList(),
                 HotSearch = hotSearches,
                 Notices = notices.Data,
                 Tags = newdic,
-                Top6Post = hot6Post,
+                Top6Post = hot6Post.ToList(),
                 PostsQueryable = postsQuery,
                 SidebarAds = AdsService.GetsByWeightedPrice(2, AdvertiseType.SideBar),
                 ListAdvertisement = AdsService.GetByWeightedPrice(AdvertiseType.PostList)

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

@@ -25,9 +25,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [Route("links"), ResponseCache(Duration = 600, VaryByHeader = "Cookie")]
-        public ActionResult Index()
+        public async Task<ActionResult> Index()
         {
-            var list = LinksService.GetQueryFromCache<bool, LinksDto>(l => l.Status == Status.Available, l => l.Recommend, false).ToList();
+            var list = await LinksService.GetQueryFromCacheAsync<bool, LinksDto>(l => l.Status == Status.Available, l => l.Recommend, false);
             return CurrentUser.IsAdmin ? View("Index_Admin", list) : View(list);
         }
 
@@ -51,7 +51,7 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             HttpClient.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
             HttpClient.DefaultRequestHeaders.Referrer = new Uri(Request.Scheme + "://" + Request.Host.ToString());
-            return await await HttpClient.GetAsync(links.Url).ContinueWith(async t =>
+            return await (await HttpClient.GetAsync(links.Url).ContinueWith(async t =>
             {
                 if (t.IsFaulted || t.IsCanceled)
                 {
@@ -87,7 +87,7 @@ namespace Masuit.MyBlogs.Core.Controllers
 
                 return ResultData(null, b, b ? "添加成功!这可能有一定的延迟,如果没有看到您的链接,请稍等几分钟后刷新页面即可,如有疑问,请联系站长。" : "添加失败!这可能是由于网站服务器内部发生了错误,如有疑问,请联系站长。");
 
-            });
+            })).ConfigureAwait(false);
         }
 
         /// <summary>
@@ -96,13 +96,13 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="links"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Add(Links links)
+        public async Task<ActionResult> Add(Links links)
         {
-            var entry = LinksService.GetById(links.Id);
+            var entry = await LinksService.GetByIdAsync(links.Id);
             bool b;
             if (entry is null)
             {
-                b = LinksService.AddEntitySaved(links) != null;
+                b = await LinksService.AddEntitySavedAsync(links) > 0;
             }
             else
             {
@@ -110,7 +110,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 entry.Except = links.Except;
                 entry.Name = links.Name;
                 entry.Recommend = links.Recommend;
-                b = LinksService.SaveChanges() > 0;
+                b = await LinksService.SaveChangesAsync() > 0;
             }
 
             return b ? ResultData(null, message: "添加成功!") : ResultData(null, false, "添加失败!");
@@ -125,7 +125,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Check(string link)
         {
             HttpClient.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
-            return await await HttpClient.GetAsync(link).ContinueWith(async t =>
+            return await (await HttpClient.GetAsync(link).ContinueWith(async t =>
             {
                 if (t.IsFaulted || t.IsCanceled)
                 {
@@ -145,7 +145,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 }
 
                 return ResultData(null, false, link + " 对方似乎没有本站的友情链接!");
-            });
+            })).ConfigureAwait(false);
         }
 
         /// <summary>
@@ -154,9 +154,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Delete(int id)
+        public async Task<ActionResult> Delete(int id)
         {
-            bool b = LinksService.DeleteByIdSaved(id);
+            bool b = await LinksService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
 
@@ -166,12 +166,12 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="model"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Edit(Links model)
+        public async Task<ActionResult> Edit(Links model)
         {
-            Links links = LinksService.GetById(model.Id);
+            Links links = await LinksService.GetByIdAsync(model.Id);
             links.Name = model.Name;
             links.Url = model.Url;
-            bool b = LinksService.SaveChanges() > 0;
+            bool b = await LinksService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? "保存成功" : "保存失败");
         }
 
@@ -194,11 +194,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         [HttpPost]
         [MyAuthorize]
-        public ActionResult ToggleWhitelist(int id, bool state)
+        public async Task<ActionResult> ToggleWhitelist(int id, bool state)
         {
-            Links link = LinksService.GetById(id);
+            Links link = await LinksService.GetByIdAsync(id);
             link.Except = !state;
-            bool b = LinksService.SaveChanges() > 0;
+            bool b = await LinksService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? "切换成功!" : "切换失败!");
         }
 
@@ -210,11 +210,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         [HttpPost]
         [MyAuthorize]
-        public ActionResult ToggleRecommend(int id, bool state)
+        public async Task<ActionResult> ToggleRecommend(int id, bool state)
         {
-            Links link = LinksService.GetById(id);
+            Links link = await LinksService.GetByIdAsync(id);
             link.Recommend = !state;
-            bool b = LinksService.SaveChanges() > 0;
+            bool b = await LinksService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? "切换成功!" : "切换失败!");
         }
 
@@ -226,11 +226,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         [HttpPost]
         [MyAuthorize]
-        public ActionResult Toggle(int id, bool state)
+        public async Task<ActionResult> Toggle(int id, bool state)
         {
-            Links link = LinksService.GetById(id);
+            Links link = await LinksService.GetByIdAsync(id);
             link.Status = !state ? Status.Available : Status.Unavailable;
-            bool b = LinksService.SaveChanges() > 0;
+            bool b = await LinksService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? "切换成功!" : "切换失败!");
         }
     }

+ 6 - 5
src/Masuit.MyBlogs.Core/Controllers/LoginController.cs

@@ -4,7 +4,7 @@ using Masuit.MyBlogs.Core.Models.ViewModel;
 using Masuit.Tools.Core.Net;
 using Microsoft.AspNetCore.Mvc;
 using System;
-using System.Linq;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -14,21 +14,22 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ILoginRecordService LoginRecordService { get; set; }
 
         [Route("delete/{id:int}/{ids}")]
-        public ActionResult Delete(int id, string ids)
+        public async Task<ActionResult> Delete(int id, string ids)
         {
             if (!string.IsNullOrWhiteSpace(ids))
             {
-                bool b = LoginRecordService.DeleteEntitySaved(r => r.UserInfoId == id && ids.Contains(r.Id.ToString())) > 0;
+                bool b = await LoginRecordService.DeleteEntitySavedAsync(r => r.UserInfoId == id && ids.Contains(r.Id.ToString())) > 0;
                 return ResultData(null, b, b ? "删除成功!" : "删除失败");
             }
+
             return ResultData(null, false, "数据不合法");
         }
 
         [Route("getrecent/{id:int}")]
-        public ActionResult GetRecentRecord(int id)
+        public async Task<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).ToList();
+            var list = await LoginRecordService.GetQueryFromCacheAsync<DateTime, LoginRecordViewModel>(r => r.UserInfoId == id && r.LoginTime >= time, r => r.LoginTime, false);
             foreach (var item in list)
             {
                 item.LoginTime = item.LoginTime.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));

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

@@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -55,10 +56,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        public ActionResult Delete(int id)
+        public async Task<ActionResult> Delete(int id)
         {
             var menus = MenuService.GetChildrenMenusByParentId(id);
-            bool b = MenuService.DeleteEntitiesSaved(menus);
+            bool b = await MenuService.DeleteEntitiesSavedAsync(menus) > 0;
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }
 
@@ -67,21 +68,20 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <param name="model"></param>
         /// <returns></returns>
-        public ActionResult Save(MenuCommand model)
+        public async Task<ActionResult> Save(MenuCommand model)
         {
             if (string.IsNullOrEmpty(model.Icon) || !model.Icon.Contains("/"))
             {
                 model.Icon = null;
             }
-            var m = MenuService.GetById(model.Id);
+            var m = await MenuService.GetByIdAsync(model.Id);
             if (m == null)
             {
-                var menu = MenuService.AddEntitySaved(model.Mapper<Menu>());
-                return menu != null ? ResultData(menu, true, "添加成功") : ResultData(null, false, "添加失败");
+                return await MenuService.AddEntitySavedAsync(model.Mapper<Menu>()) > 0 ? ResultData(model, true, "添加成功") : ResultData(null, false, "添加失败");
             }
 
             Mapper.Map(model, m);
-            bool b = MenuService.SaveChanges() > 0;
+            bool b = await MenuService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? "修改成功" : "修改失败");
         }
     }

+ 20 - 20
src/Masuit.MyBlogs.Core/Controllers/MergeController.cs

@@ -18,6 +18,7 @@ using System;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Text.RegularExpressions;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -34,9 +35,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [HttpGet("{id}")]
-        public ActionResult Get(int id)
+        public async Task<ActionResult> Get(int id)
         {
-            var p = Mapper.Map<PostMergeRequestDto>(PostMergeRequestService.GetById(id));
+            var p = Mapper.Map<PostMergeRequestDto>(await PostMergeRequestService.GetByIdAsync(id));
             if (p != null)
             {
                 p.SubmitTime = p.SubmitTime.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
@@ -76,9 +77,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="mid"></param>
         /// <returns></returns>
         [HttpGet("compare/{mid}")]
-        public IActionResult MergeCompare(int mid)
+        public async Task<IActionResult> MergeCompare(int mid)
         {
-            var newer = PostMergeRequestService.GetById(mid) ?? throw new NotFoundException("待合并文章未找到");
+            var newer = await PostMergeRequestService.GetByIdAsync(mid) ?? throw new NotFoundException("待合并文章未找到");
             var old = newer.Post;
             var diffHelper = new HtmlDiff.HtmlDiff(old.Content, newer.Content);
             string diffOutput = diffHelper.Build();
@@ -93,26 +94,25 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [HttpPost("{id}")]
-        public IActionResult Merge(int id)
+        public async Task<IActionResult> Merge(int id)
         {
-            var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到");
+            var merge = await PostMergeRequestService.GetByIdAsync(id) ?? throw new NotFoundException("待合并文章未找到");
             var history = merge.Post.Mapper<PostHistoryVersion>();
             history.Id = 0;
             merge.Post = Mapper.Map(merge, merge.Post);
             merge.Post.PostHistoryVersion.Add(history);
             merge.Post.ModifyDate = DateTime.Now;
             merge.MergeState = MergeStatus.Merged;
-            var b = PostMergeRequestService.SaveChanges() > 0;
+            var b = await PostMergeRequestService.SaveChangesAsync() > 0;
             if (!b)
             {
                 return ResultData(null, false, "文章合并失败!");
             }
 
             string link = Request.Scheme + "://" + Request.Host + "/" + merge.Post.Id;
-            string content = new Template(System.IO.File.ReadAllText(HostEnvironment.WebRootPath + "/template/merge-pass.html")).Set("link", link).Set("title", merge.Post.Title).Render();
+            string content = new Template(await System.IO.File.ReadAllTextAsync(HostEnvironment.WebRootPath + "/template/merge-pass.html")).Set("link", link).Set("title", merge.Post.Title).Render();
             BackgroundJob.Enqueue(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Title"] + "博客你提交的修改已通过", content, merge.ModifierEmail));
             return ResultData(null, true, "文章合并完成!");
-
         }
 
         /// <summary>
@@ -121,12 +121,12 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost]
-        public IActionResult Merge([FromForm] PostMergeRequestCommandBase dto)
+        public async Task<IActionResult> Merge([FromForm] PostMergeRequestCommandBase dto)
         {
-            var merge = PostMergeRequestService.GetById(dto.Id) ?? throw new NotFoundException("待合并文章未找到");
+            var merge = await PostMergeRequestService.GetByIdAsync(dto.Id) ?? throw new NotFoundException("待合并文章未找到");
             Mapper.Map(dto, merge);
-            var b = PostMergeRequestService.SaveChanges() > 0;
-            return b ? Merge(merge.Id) : ResultData(null, false, "文章合并失败!");
+            var b = await PostMergeRequestService.SaveChangesAsync() > 0;
+            return b ? await Merge(merge.Id) : ResultData(null, false, "文章合并失败!");
         }
 
         /// <summary>
@@ -136,18 +136,18 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="reason"></param>
         /// <returns></returns>
         [HttpPost("reject/{id}")]
-        public ActionResult Reject(int id, string reason)
+        public async Task<ActionResult> Reject(int id, string reason)
         {
-            var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到");
+            var merge = await PostMergeRequestService.GetByIdAsync(id) ?? throw new NotFoundException("待合并文章未找到");
             merge.MergeState = MergeStatus.Reject;
-            var b = PostMergeRequestService.SaveChanges() > 0;
+            var b = await PostMergeRequestService.SaveChangesAsync() > 0;
             if (!b)
             {
                 return ResultData(null, false, "操作失败!");
             }
 
             var link = Request.Scheme + "://" + Request.Host + "/" + merge.Post.Id + "/merge/" + id;
-            var content = new Template(System.IO.File.ReadAllText(HostEnvironment.WebRootPath + "/template/merge-reject.html")).Set("link", link).Set("title", merge.Post.Title).Set("reason", reason).Render();
+            var content = new Template(await System.IO.File.ReadAllTextAsync(HostEnvironment.WebRootPath + "/template/merge-reject.html")).Set("link", link).Set("title", merge.Post.Title).Set("reason", reason).Render();
             BackgroundJob.Enqueue(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Title"] + "博客你提交的修改已被拒绝", content, merge.ModifierEmail));
             return ResultData(null, true, "合并已拒绝!");
         }
@@ -158,11 +158,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [HttpPost("block/{id}")]
-        public ActionResult Block(int id)
+        public async Task<ActionResult> Block(int id)
         {
-            var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到");
+            var merge = await PostMergeRequestService.GetByIdAsync(id) ?? throw new NotFoundException("待合并文章未找到");
             merge.MergeState = MergeStatus.Block;
-            var b = PostMergeRequestService.SaveChanges() > 0;
+            var b = await PostMergeRequestService.SaveChangesAsync() > 0;
             return b ? ResultData(null, true, "操作成功!") : ResultData(null, false, "操作失败!");
         }
     }

+ 11 - 9
src/Masuit.MyBlogs.Core/Controllers/MiscController.cs

@@ -41,9 +41,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [Route("misc/{id:int}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id" }, VaryByHeader = "Cookie")]
-        public ActionResult Index(int id)
+        public async Task<ActionResult> Index(int id)
         {
-            var misc = MiscService.GetFromCache(m => m.Id == id) ?? throw new NotFoundException("页面未找到");
+            var misc = await MiscService.GetFromCacheAsync(m => m.Id == id) ?? throw new NotFoundException("页面未找到");
             misc.ModifyDate = misc.ModifyDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
             misc.PostDate = misc.PostDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
             return View(misc);
@@ -67,9 +67,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="size"></param>
         /// <returns></returns>
         [Route("donatelist")]
-        public ActionResult DonateList(int page = 1, int size = 10)
+        public async Task<ActionResult> DonateList(int page = 1, int size = 10)
         {
-            var list = DonateService.GetPagesFromCache<DateTime, DonateDto>(page, size, d => true, d => d.DonateTime, false);
+            var list = await DonateService.GetPagesFromCacheAsync<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("匿名")))
@@ -78,6 +78,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     item.Email = item.Email.MaskEmail();
                 }
             }
+
             return Ok(list);
         }
 
@@ -130,9 +131,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Delete(int id)
+        public async Task<ActionResult> Delete(int id)
         {
-            var post = MiscService.GetById(id) ?? throw new NotFoundException("杂项页已被删除!");
+            var post = await MiscService.GetByIdAsync(id) ?? throw new NotFoundException("杂项页已被删除!");
             var srcs = post.Content.MatchImgSrcs().Where(s => s.StartsWith("/"));
             foreach (var path in srcs)
             {
@@ -145,7 +146,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 }
             }
 
-            bool b = MiscService.DeleteByIdSaved(id);
+            bool b = await MiscService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }
 
@@ -190,14 +191,15 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Get(int id)
+        public async Task<ActionResult> Get(int id)
         {
-            var misc = MiscService.GetById(id);
+            var misc = await MiscService.GetByIdAsync(id);
             if (misc != null)
             {
                 misc.ModifyDate = misc.ModifyDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
                 misc.PostDate = misc.PostDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
             }
+
             return ResultData(misc.MapTo<MiscDto>());
         }
     }

+ 18 - 17
src/Masuit.MyBlogs.Core/Controllers/MsgController.cs

@@ -20,6 +20,7 @@ using System.ComponentModel.DataAnnotations;
 using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -115,7 +116,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost, ValidateAntiForgeryToken]
-        public ActionResult Submit(LeaveMessageCommand dto)
+        public async Task<ActionResult> Submit(LeaveMessageCommand dto)
         {
             var match = Regex.Match(dto.NickName + dto.Content, CommonHelper.BanRegex);
             if (match.Success)
@@ -162,12 +163,12 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             HttpContext.Session.Set("msg", msg.Content.RemoveHtmlTag().Trim());
             var email = CommonHelper.SystemSettings["ReceiveEmail"];
-            var content = new Template(System.IO.File.ReadAllText(HostEnvironment.WebRootPath + "/template/notify.html")).Set("title", "网站留言板").Set("time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Set("nickname", msg.NickName).Set("content", msg.Content);
+            var content = new Template(await System.IO.File.ReadAllTextAsync(HostEnvironment.WebRootPath + "/template/notify.html")).Set("title", "网站留言板").Set("time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Set("nickname", msg.NickName).Set("content", msg.Content);
             if (msg.Status == Status.Published)
             {
                 if (!msg.IsMaster)
                 {
-                    MessageService.AddEntitySaved(new InternalMessage()
+                    await MessageService.AddEntitySavedAsync(new InternalMessage()
                     {
                         Title = $"来自【{msg.NickName}】的新留言",
                         Content = msg.Content,
@@ -208,14 +209,14 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Pass(int id)
+        public async Task<ActionResult> Pass(int id)
         {
-            var msg = LeaveMessageService.GetById(id);
+            var msg = await LeaveMessageService.GetByIdAsync(id);
             msg.Status = Status.Published;
-            bool b = LeaveMessageService.SaveChanges() > 0;
+            bool b = await LeaveMessageService.SaveChangesAsync() > 0;
 #if !DEBUG
             var pid = msg.ParentId == 0 ? msg.Id : LeaveMessageService.GetParentMessageIdByChildId(id);
-            var content = new Template(System.IO.File.ReadAllText(Path.Combine(HostEnvironment.WebRootPath, "template", "notify.html"))).Set("time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Set("nickname", msg.NickName).Set("content", msg.Content);
+            var content = new Template(await System.IO.File.ReadAllTextAsync(Path.Combine(HostEnvironment.WebRootPath, "template", "notify.html"))).Set("time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Set("nickname", msg.NickName).Set("content", msg.Content);
             var emails = LeaveMessageService.GetSelfAndAllChildrenMessagesByParentId(pid).Select(c => c.Email).Except(new List<string> { msg.Email, CurrentUser.Email }).ToHashSet();
             var link = Url.Action("Index", "Msg", new { cid = pid }, Request.Scheme);
             foreach (var s in emails)
@@ -262,11 +263,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Read(int id)
+        public async Task<ActionResult> Read(int id)
         {
-            var msg = MessageService.GetById(id);
+            var msg = await MessageService.GetByIdAsync(id);
             msg.Read = true;
-            MessageService.SaveChanges();
+            await MessageService.SaveChangesAsync();
             return Content("ok");
         }
 
@@ -276,11 +277,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Unread(int id)
+        public async Task<ActionResult> Unread(int id)
         {
-            var msg = MessageService.GetById(id);
+            var msg = await MessageService.GetByIdAsync(id);
             msg.Read = false;
-            MessageService.SaveChanges();
+            await MessageService.SaveChangesAsync();
             return Content("ok");
         }
 
@@ -290,9 +291,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult DeleteMsg(int id)
+        public async Task<ActionResult> DeleteMsg(int id)
         {
-            bool b = MessageService.DeleteByIdSaved(id);
+            bool b = await MessageService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "站内消息删除成功!" : "站内消息删除失败!");
         }
 
@@ -325,9 +326,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult ClearMsgs()
+        public async Task<ActionResult> ClearMsgs()
         {
-            MessageService.DeleteEntitySaved(m => m.Read);
+            await MessageService.DeleteEntitySavedAsync(m => m.Read);
             return ResultData(null, true, "站内消息清除成功!");
         }
 

+ 11 - 11
src/Masuit.MyBlogs.Core/Controllers/NoticeController.cs

@@ -39,9 +39,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="size"></param>
         /// <returns></returns>
         [Route("notice"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "page", "size" }, VaryByHeader = "Cookie")]
-        public ActionResult Index([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
+        public async Task<ActionResult> Index([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
-            var list = NoticeService.GetPages<DateTime, NoticeDto>(page, size, n => n.Status == Status.Display, n => n.ModifyDate, false);
+            var list = await NoticeService.GetPagesFromCacheAsync<DateTime, NoticeDto>(page, size, n => n.Status == Status.Display, n => n.ModifyDate, false);
             ViewData["page"] = new Pagination(page, size, list.TotalCount);
             foreach (var n in list.Data)
             {
@@ -58,15 +58,15 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [Route("n/{id:int}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id" }, VaryByHeader = "Cookie")]
-        public ActionResult Details(int id)
+        public async Task<ActionResult> Details(int id)
         {
-            var notice = NoticeService.GetById(id) ?? throw new NotFoundException("页面未找到");
+            var notice = await NoticeService.GetByIdAsync(id) ?? throw new NotFoundException("页面未找到");
             notice.ModifyDate = notice.ModifyDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
             notice.PostDate = notice.PostDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
             if (!HttpContext.Session.TryGetValue("notice" + id, out _))
             {
                 notice.ViewCount += 1;
-                NoticeService.SaveChanges();
+                await NoticeService.SaveChangesAsync();
                 HttpContext.Session.Set("notice" + id, notice.Title);
             }
 
@@ -92,9 +92,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Delete(int id)
+        public async Task<ActionResult> Delete(int id)
         {
-            var notice = NoticeService.GetById(id) ?? throw new NotFoundException("公告已经被删除!");
+            var notice = await NoticeService.GetByIdAsync(id) ?? throw new NotFoundException("公告已经被删除!");
             var srcs = notice.Content.MatchImgSrcs().Where(s => s.StartsWith("/"));
             foreach (var path in srcs)
             {
@@ -107,7 +107,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 }
             }
 
-            bool b = NoticeService.DeleteByIdSaved(id);
+            bool b = await NoticeService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }
 
@@ -168,9 +168,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [ResponseCache(Duration = 600, VaryByHeader = "Cookie")]
-        public ActionResult Last()
+        public async Task<ActionResult> Last()
         {
-            var notice = NoticeService.Get(n => n.Status == Status.Display, n => n.ModifyDate, false);
+            var notice = await NoticeService.GetAsync(n => n.Status == Status.Display, n => n.ModifyDate, false);
             if (notice == null)
             {
                 return ResultData(null, false);
@@ -182,7 +182,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             }
 
             notice.ViewCount += 1;
-            NoticeService.SaveChanges();
+            await NoticeService.SaveChangesAsync();
             var dto = notice.Mapper<NoticeDto>();
             Response.Cookies.Append("last-notice", dto.Id.ToString(), new CookieOptions()
             {

+ 59 - 67
src/Masuit.MyBlogs.Core/Controllers/PostController.cs

@@ -76,7 +76,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             related.RemoveAll(p => p.Id == id);
             if (related.Count <= 1)
             {
-                related = PostService.GetPagesFromCache(1, 10, p => p.Id != id && p.CategoryId == post.CategoryId, p => p.TotalViewCount, false).Data;
+                related = (await PostService.GetPagesFromCacheAsync(1, 10, p => p.Id != id && p.CategoryId == post.CategoryId, p => p.TotalViewCount, false)).Data;
             }
 
             ViewBag.Related = related;
@@ -210,10 +210,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// 投稿页
         /// </summary>
         /// <returns></returns>
-        public ActionResult Publish()
+        public async Task<ActionResult> Publish()
         {
             var list = PostService.GetQuery(p => !string.IsNullOrEmpty(p.Label)).Select(p => p.Label).Distinct().ToList().SelectMany(s => s.Split(',', ',')).OrderBy(s => s).ToHashSet();
-            ViewBag.Category = CategoryService.GetQueryFromCache(c => c.Status == Status.Available).ToList();
+            ViewBag.Category = await CategoryService.GetQueryFromCacheAsync(c => c.Status == Status.Available);
             return View(list);
         }
 
@@ -373,9 +373,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [HttpGet("{id}/merge")]
-        public ActionResult PushMerge(int id)
+        public async Task<ActionResult> PushMerge(int id)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             return View(post);
         }
 
@@ -386,9 +386,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="mid"></param>
         /// <returns></returns>
         [HttpGet("{id}/merge/{mid}")]
-        public ActionResult RepushMerge(int id, int mid)
+        public async Task<ActionResult> RepushMerge(int id, int mid)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             var merge = post.PostMergeRequests.FirstOrDefault(p => p.Id == mid && p.MergeState != MergeStatus.Merged) ?? throw new NotFoundException("待合并文章未找到");
             return View(merge);
         }
@@ -399,14 +399,14 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("{id}/pushmerge")]
-        public ActionResult PushMerge(PostMergeRequestCommand dto)
+        public async Task<ActionResult> PushMerge(PostMergeRequestCommand dto)
         {
-            if (RedisHelper.Get("code:" + dto.ModifierEmail) != dto.Code)
+            if (await RedisHelper.GetAsync("code:" + dto.ModifierEmail) != dto.Code)
             {
                 return ResultData(null, false, "验证码错误!");
             }
 
-            var post = PostService.GetById(dto.PostId) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(dto.PostId) ?? throw new NotFoundException("文章未找到");
             var diff = new HtmlDiff.HtmlDiff(post.Content.RemoveHtmlTag(), dto.Content.RemoveHtmlTag());
             if (post.Title.Equals(dto.Title) && !diff.Build().Contains(new[] { "diffmod", "diffdel", "diffins" }))
             {
@@ -435,7 +435,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Mapper.Map(dto, post);
                 post.PostHistoryVersion.Add(history);
                 post.ModifyDate = DateTime.Now;
-                return PostService.SaveChanges() > 0 ? ResultData(null, true, "你是文章原作者,无需审核,文章已自动更新并在首页展示!") : ResultData(null, false, "操作失败!");
+                return await PostService.SaveChangesAsync() > 0 ? ResultData(null, true, "你是文章原作者,无需审核,文章已自动更新并在首页展示!") : ResultData(null, false, "操作失败!");
             }
 
             #endregion
@@ -453,20 +453,20 @@ namespace Masuit.MyBlogs.Core.Controllers
                 post.PostMergeRequests.Add(merge);
             }
 
-            var b = PostService.SaveChanges() > 0;
+            var b = await PostService.SaveChangesAsync() > 0;
             if (!b)
             {
                 return ResultData(null, false, "操作失败!");
             }
 
-            RedisHelper.Expire("code:" + dto.ModifierEmail, 1);
-            MessageService.AddEntitySaved(new InternalMessage()
+            await RedisHelper.ExpireAsync("code:" + dto.ModifierEmail, 1);
+            await MessageService.AddEntitySavedAsync(new InternalMessage()
             {
                 Title = $"来自【{dto.Modifier}】的文章修改合并请求",
                 Content = dto.Title,
                 Link = "#/merge/compare?id=" + merge.Id
             });
-            var content = new Template(System.IO.File.ReadAllText(HostEnvironment.WebRootPath + "/template/merge-request.html")).Set("title", post.Title).Set("link", Url.Action("Index", "Dashboard", new { }, Request.Scheme) + "#/merge/compare?id=" + merge.Id).Render();
+            var content = new Template(await System.IO.File.ReadAllTextAsync(HostEnvironment.WebRootPath + "/template/merge-request.html")).Set("title", post.Title).Set("link", Url.Action("Index", "Dashboard", new { }, Request.Scheme) + "#/merge/compare?id=" + merge.Id).Render();
             BackgroundJob.Enqueue(() => CommonHelper.SendMail("博客文章修改请求:", content, CommonHelper.SystemSettings["ReceiveEmail"]));
             return ResultData(null, true, "您的修改请求已提交,已进入审核状态,感谢您的参与!");
         }
@@ -479,11 +479,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Fixtop(int id)
+        public async Task<ActionResult> Fixtop(int id)
         {
-            Post post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            Post post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             post.IsFixedTop = !post.IsFixedTop;
-            bool b = PostService.SaveChanges() > 0;
+            bool b = await PostService.SaveChangesAsync() > 0;
             return b ? ResultData(null, true, post.IsFixedTop ? "置顶成功!" : "取消置顶成功!") : ResultData(null, false, "操作失败!");
         }
 
@@ -493,13 +493,13 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Pass(int id)
+        public async Task<ActionResult> Pass(int id)
         {
-            Post post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            Post post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             post.Status = Status.Published;
             post.ModifyDate = DateTime.Now;
             post.PostDate = DateTime.Now;
-            bool b = PostService.SaveChanges() > 0;
+            bool b = await PostService.SaveChangesAsync() > 0;
             if (!b)
             {
                 SearchEngine.LuceneIndexer.Add(post);
@@ -520,11 +520,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Delete(int id)
+        public async Task<ActionResult> Delete(int id)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             post.Status = Status.Deleted;
-            bool b = PostService.SaveChanges(true) > 0;
+            bool b = await PostService.SaveChangesAsync(true) > 0;
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
 
@@ -534,11 +534,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Restore(int id)
+        public async Task<ActionResult> Restore(int id)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             post.Status = Status.Published;
-            bool b = PostService.SaveChanges() > 0;
+            bool b = await PostService.SaveChangesAsync() > 0;
             SearchEngine.LuceneIndexer.Add(post);
             return ResultData(null, b, b ? "恢复成功!" : "恢复失败!");
         }
@@ -549,9 +549,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Truncate(int id)
+        public async Task<ActionResult> Truncate(int id)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             var srcs = post.Content.MatchImgSrcs();
             foreach (var path in srcs)
             {
@@ -567,7 +567,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 }
             }
 
-            bool b = PostService.DeleteByIdSaved(id);
+            bool b = await PostService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
 
@@ -577,28 +577,20 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Get(int id)
+        public async Task<ActionResult> Get(int id)
         {
-            Post post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            Post post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             PostDto model = post.Mapper<PostDto>();
             model.Seminars = post.Seminar.Select(s => s.Seminar.Title).Join(",");
             return ResultData(model);
         }
 
-        ///// <summary>
-        ///// 文章详情
-        ///// </summary>
-        ///// <param name="id"></param>
-        ///// <returns></returns>
-        //[MyAuthorize]
-        //public ActionResult Read(int id) => ResultData(PostService.GetById(id).Mapper<PostDto>());
-
         /// <summary>
         /// 获取文章分页
         /// </summary>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult GetPageData([Range(1, int.MaxValue, ErrorMessage = "页数必须大于0")] 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([Range(1, int.MaxValue, ErrorMessage = "页数必须大于0")] int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")] int size = 10, OrderBy orderby = OrderBy.ModifyDate, string kw = "", int? cid = null)
         {
             Expression<Func<Post, bool>> where = p => true;
             if (cid.HasValue)
@@ -611,7 +603,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 where = where.And(p => p.Title.Contains(kw) || p.Author.Contains(kw) || p.Email.Contains(kw) || p.Label.Contains(kw) || p.Content.Contains(kw));
             }
 
-            var list = PostService.GetQuery(where).OrderBy($"{nameof(Post.Status)} desc,{nameof(Post.IsFixedTop)} desc,{orderby.GetDisplay()} desc").ToPagedList<Post, PostDataModel>(page, size, MapperConfig);
+            var list = await PostService.GetQuery(where).OrderBy($"{nameof(Post.Status)} desc,{nameof(Post.IsFixedTop)} desc,{orderby.GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDataModel>(page, size, MapperConfig);
             foreach (var item in list.Data)
             {
                 item.ModifyDate = item.ModifyDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
@@ -629,7 +621,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="search"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult GetPending([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15, string search = "")
+        public async Task<ActionResult> GetPending([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15, string search = "")
         {
             Expression<Func<Post, bool>> where = p => p.Status == Status.Pending;
             if (!string.IsNullOrEmpty(search))
@@ -637,7 +629,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 = PostService.GetQuery(where).OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.ModifyDate).ToPagedList<Post, PostDataModel>(page, size, MapperConfig);
+            var pages = await PostService.GetQuery(where).OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.ModifyDate).ToCachedPagedListAsync<Post, PostDataModel>(page, size, MapperConfig);
             foreach (var item in pages.Data)
             {
                 item.ModifyDate = item.ModifyDate.ToTimeZone(HttpContext.Session.Get<string>(SessionKey.TimeZone));
@@ -811,10 +803,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="sid"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult AddSeminar(int id, int sid)
+        public async Task<ActionResult> AddSeminar(int id, int sid)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
-            Seminar seminar = SeminarService.GetById(sid) ?? throw new NotFoundException("专题未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
+            Seminar seminar = await SeminarService.GetByIdAsync(sid) ?? throw new NotFoundException("专题未找到");
             post.Seminar.Add(new SeminarPost()
             {
                 Post = post,
@@ -822,7 +814,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 SeminarId = seminar.Id,
                 PostId = post.Id
             });
-            bool b = PostService.SaveChanges() > 0;
+            bool b = await PostService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? $"已将文章【{post.Title}】添加到专题【{seminar.Title}】" : "添加失败");
         }
 
@@ -833,10 +825,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="sid"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult RemoveSeminar(int id, int sid)
+        public async Task<ActionResult> RemoveSeminar(int id, int sid)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
-            Seminar seminar = SeminarService.GetById(sid) ?? throw new NotFoundException("专题未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
+            Seminar seminar = await SeminarService.GetByIdAsync(sid) ?? throw new NotFoundException("专题未找到");
             post.Seminar.Remove(new SeminarPost()
             {
                 Post = post,
@@ -844,7 +836,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 SeminarId = seminar.Id,
                 PostId = post.Id
             });
-            bool b = PostService.SaveChanges() > 0;
+            bool b = await PostService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? $"已将文章【{post.Title}】从【{seminar.Title}】专题移除" : "添加失败");
         }
 
@@ -854,9 +846,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult DeleteHistory(int id)
+        public async Task<ActionResult> DeleteHistory(int id)
         {
-            bool b = PostHistoryVersionService.DeleteByIdSaved(id);
+            bool b = await PostHistoryVersionService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "历史版本文章删除成功!" : "历史版本文章删除失败!");
         }
 
@@ -866,9 +858,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Revert(int id)
+        public async Task<ActionResult> Revert(int id)
         {
-            var history = PostHistoryVersionService.GetById(id) ?? throw new NotFoundException("版本不存在");
+            var history = await PostHistoryVersionService.GetByIdAsync(id) ?? throw new NotFoundException("版本不存在");
             history.Post.Category = history.Category;
             history.Post.CategoryId = history.CategoryId;
             history.Post.Content = history.Content;
@@ -886,8 +878,8 @@ namespace Masuit.MyBlogs.Core.Controllers
                     SeminarId = s.SeminarId
                 });
             }
-            bool b = SearchEngine.SaveChanges() > 0;
-            PostHistoryVersionService.DeleteByIdSaved(id);
+            bool b = await SearchEngine.SaveChangesAsync() > 0;
+            await PostHistoryVersionService.DeleteByIdSavedAsync(id);
             return ResultData(null, b, b ? "回滚成功" : "回滚失败");
         }
 
@@ -897,11 +889,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id">文章id</param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult DisableComment(int id)
+        public async Task<ActionResult> DisableComment(int id)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             post.DisableComment = !post.DisableComment;
-            return ResultData(null, PostService.SaveChanges() > 0, post.DisableComment ? $"已禁用【{post.Title}】这篇文章的评论功能!" : $"已启用【{post.Title}】这篇文章的评论功能!");
+            return ResultData(null, await PostService.SaveChangesAsync() > 0, post.DisableComment ? $"已禁用【{post.Title}】这篇文章的评论功能!" : $"已启用【{post.Title}】这篇文章的评论功能!");
         }
 
         /// <summary>
@@ -910,11 +902,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id">文章id</param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult DisableCopy(int id)
+        public async Task<ActionResult> DisableCopy(int id)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             post.DisableCopy = !post.DisableCopy;
-            return ResultData(null, PostService.SaveChanges() > 0, post.DisableCopy ? $"已开启【{post.Title}】这篇文章的防复制功能!" : $"已关闭【{post.Title}】这篇文章的防复制功能!");
+            return ResultData(null, await PostService.SaveChangesAsync() > 0, post.DisableCopy ? $"已开启【{post.Title}】这篇文章的防复制功能!" : $"已关闭【{post.Title}】这篇文章的防复制功能!");
         }
 
         /// <summary>
@@ -923,11 +915,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id">文章id</param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Refresh(int id)
+        public async Task<ActionResult> Refresh(int id)
         {
-            var post = PostService.GetById(id) ?? throw new NotFoundException("文章未找到");
+            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
             post.ModifyDate = DateTime.Now;
-            PostService.SaveChanges();
+            await PostService.SaveChangesAsync();
             return RedirectToAction("Details", new { id });
         }
 

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

@@ -14,6 +14,7 @@ using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -38,7 +39,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="size"></param>
         /// <returns></returns>
         [Route("s/{wd?}/{page:int?}/{size:int?}")]
-        public ActionResult Search(string wd = "", [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
+        public async Task<ActionResult> Search(string wd = "", [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
             wd = wd?.Trim();
             ViewBag.PageSize = size;
@@ -62,7 +63,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                         SearchTime = DateTime.Now,
                         IP = ClientIP
                     });
-                    SearchDetailsService.SaveChanges();
+                    await SearchDetailsService.SaveChangesAsync();
                     HttpContext.Session.Set("search:" + wd, wd.ToByteArray());
                 }
 
@@ -123,9 +124,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [HttpPost, MyAuthorize]
-        public ActionResult Delete(int id)
+        public async Task<ActionResult> Delete(int id)
         {
-            bool b = SearchDetailsService.DeleteByIdSaved(id);
+            bool b = await SearchDetailsService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
     }

+ 18 - 17
src/Masuit.MyBlogs.Core/Controllers/SeminarController.cs

@@ -1,12 +1,12 @@
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
+using Masuit.MyBlogs.Core.Infrastructure.Repository;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models;
 using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.Tools;
-using Masuit.Tools.Models;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc;
 using System;
@@ -15,6 +15,7 @@ using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Linq.Dynamic.Core;
 using System.Runtime.InteropServices;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -44,10 +45,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="orderBy"></param>
         /// <returns></returns>
         [Route("c/{id:int}/{page:int?}/{size:int?}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id", "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
-        public ActionResult Index(int id, [Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")]int size = 15)
+        public async Task<ActionResult> Index(int id, [Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
-            var s = SeminarService.GetById(id) ?? throw new NotFoundException("文章未找到");
-            var posts = PostService.GetQuery<PostDto>(p => p.Seminar.Any(x => x.SeminarId == id) && (p.Status == Status.Published || CurrentUser.IsAdmin)).OrderBy($"{nameof(Post.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToPagedList(page, size);
+            var s = await SeminarService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
+            var posts = await PostService.GetQuery<PostDto>(p => p.Seminar.Any(x => x.SeminarId == id) && (p.Status == Status.Published || CurrentUser.IsAdmin)).OrderBy($"{nameof(Post.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync(page, size);
             ViewBag.Title = s.Title;
             ViewBag.Desc = s.Description;
             ViewBag.SubTitle = s.SubTitle;
@@ -108,9 +109,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Delete(int id)
+        public async Task<ActionResult> Delete(int id)
         {
-            bool b = SeminarService.DeleteByIdSaved(id);
+            bool b = await SeminarService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }
 
@@ -120,9 +121,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult Get(int id)
+        public async Task<ActionResult> Get(int id)
         {
-            Seminar seminar = SeminarService.GetById(id);
+            Seminar seminar = await SeminarService.GetByIdAsync(id);
             return ResultData(seminar.Mapper<SeminarDto>());
         }
 
@@ -133,7 +134,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="size"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult GetPageData([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")]int size = 15)
+        public ActionResult GetPageData([Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
             var list = SeminarService.GetPages<int, SeminarDto>(page, size, s => true, s => s.Id, false);
             return Ok(list);
@@ -157,10 +158,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="pid"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult AddPost(int id, int pid)
+        public async Task<ActionResult> AddPost(int id, int pid)
         {
-            Seminar seminar = SeminarService.GetById(id);
-            Post post = PostService.GetById(pid);
+            Seminar seminar = await SeminarService.GetByIdAsync(id);
+            Post post = await PostService.GetByIdAsync(pid);
             seminar.Post.Add(new SeminarPost()
             {
                 Post = post,
@@ -168,7 +169,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 PostId = post.Id,
                 SeminarId = id
             });
-            bool b = SeminarService.SaveChanges() > 0;
+            bool b = await SeminarService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? $"已成功将【{post.Title}】添加到专题【{seminar.Title}】" : "添加失败!");
         }
 
@@ -179,11 +180,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="pid"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public ActionResult RemovePost(int id, int pid)
+        public async Task<ActionResult> RemovePost(int id, int pid)
         {
-            Seminar seminar = SeminarService.GetById(id);
-            Post post = PostService.GetById(pid);
-            bool b = SeminarPostService.DeleteEntitySaved(s => s.SeminarId == id && s.PostId == pid) > 0;
+            Seminar seminar = await SeminarService.GetByIdAsync(id);
+            Post post = await PostService.GetByIdAsync(pid);
+            bool b = await SeminarPostService.DeleteEntitySavedAsync(s => s.SeminarId == id && s.PostId == pid) > 0;
             return ResultData(null, b, b ? $"已成功将【{post.Title}】从专题【{seminar.Title}】移除" : "添加失败!");
         }
 

+ 6 - 5
src/Masuit.MyBlogs.Core/Controllers/ShareController.cs

@@ -2,6 +2,7 @@
 using Masuit.MyBlogs.Core.Models.Entity;
 using Microsoft.AspNetCore.Mvc;
 using System.Linq;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -43,9 +44,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [HttpPost]
-        public ActionResult Remove(int id)
+        public async Task<ActionResult> Remove(int id)
         {
-            bool b = FastShareService.DeleteByIdSaved(id);
+            bool b = await FastShareService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }
 
@@ -55,13 +56,13 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="model"></param>
         /// <returns></returns>
         [HttpPost]
-        public ActionResult Update(FastShare model)
+        public async Task<ActionResult> Update(FastShare model)
         {
-            FastShare share = FastShareService.GetById(model.Id);
+            FastShare share = await FastShareService.GetByIdAsync(model.Id);
             share.Title = model.Title;
             share.Link = model.Link;
             share.Sort = model.Sort;
-            bool b = FastShareService.SaveChanges() > 0;
+            bool b = await FastShareService.SaveChangesAsync() > 0;
             return ResultData(null, b, b ? "更新成功" : "更新失败");
         }
     }

+ 17 - 16
src/Masuit.MyBlogs.Core/Controllers/SubscribeController.cs

@@ -11,6 +11,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Text;
+using System.Threading.Tasks;
 using WilderMinds.RssSyndication;
 using Z.EntityFramework.Plus;
 
@@ -54,12 +55,12 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [Route("/rss"), ResponseCache(Duration = 3600)]
-        public IActionResult Rss()
+        public async Task<IActionResult> Rss()
         {
             var time = DateTime.Today.AddDays(-1);
             string scheme = Request.Scheme;
             var host = Request.Host;
-            var posts = PostService.GetQueryNoTracking(p => p.Status == Status.Published && p.ModifyDate >= time, p => p.ModifyDate, false).Select(p => new Item()
+            var posts = await PostService.GetQueryNoTracking(p => p.Status == Status.Published && p.ModifyDate >= time, p => p.ModifyDate, false).Select(p => new Item()
             {
                 Author = new Author
                 {
@@ -77,10 +78,10 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Permalink = scheme + "://" + host + "/" + p.Id,
                 Guid = p.Id.ToString(),
                 FullHtmlContent = p.Content.GetSummary(300, 50)
-            }).FromCache(new MemoryCacheEntryOptions()
+            }).FromCacheAsync(new MemoryCacheEntryOptions()
             {
                 AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
-            }).ToList();
+            });
             var feed = new Feed()
             {
                 Title = CommonHelper.SystemSettings["Title"],
@@ -102,13 +103,13 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [Route("/cat/{id}/rss"), ResponseCache(Duration = 3600)]
-        public IActionResult CategoryRss(int id)
+        public async Task<IActionResult> CategoryRss(int id)
         {
             var time = DateTime.Today.AddDays(-1);
             string scheme = Request.Scheme;
             var host = Request.Host;
-            var category = CategoryService.GetById(id) ?? throw new NotFoundException("分类未找到");
-            var posts = PostService.GetQueryNoTracking(p => p.CategoryId == id && p.Status == Status.Published && p.ModifyDate >= time, p => p.ModifyDate, false).Select(p => new Item()
+            var category = await CategoryService.GetByIdAsync(id) ?? throw new NotFoundException("分类未找到");
+            var posts = await PostService.GetQueryNoTracking(p => p.CategoryId == id && p.Status == Status.Published && p.ModifyDate >= time, p => p.ModifyDate, false).Select(p => new Item()
             {
                 Author = new Author
                 {
@@ -126,10 +127,10 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Permalink = scheme + "://" + host + "/" + p.Id,
                 Guid = p.Id.ToString(),
                 FullHtmlContent = p.Content.GetSummary(300, 50)
-            }).FromCache(new MemoryCacheEntryOptions()
+            }).FromCacheAsync(new MemoryCacheEntryOptions()
             {
                 AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
-            }).ToList();
+            });
             var feed = new Feed()
             {
                 Title = Request.Host + $":分类{category.Name}文章订阅",
@@ -151,11 +152,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [Route("/{id}/rss"), ResponseCache(Duration = 3600)]
-        public IActionResult PostRss(int id)
+        public async Task<IActionResult> PostRss(int id)
         {
             string scheme = Request.Scheme;
             var host = Request.Host;
-            var p = PostService.Get(p => p.Status == Status.Published && p.Id == id) ?? throw new NotFoundException("文章未找到");
+            var p = await PostService.GetAsync(p => p.Status == Status.Published && p.Id == id) ?? throw new NotFoundException("文章未找到");
             var summary = p.Content.GetSummary(300, 50);
             var item = new Item()
             {
@@ -197,13 +198,13 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [Route("/{id}/comments/rss"), ResponseCache(Duration = 600)]
-        public IActionResult CommentsRss(int id)
+        public async Task<IActionResult> CommentsRss(int id)
         {
             string scheme = Request.Scheme;
             var host = Request.Host;
-            var post = PostService.Get(p => p.Status == Status.Published && p.Id == id) ?? throw new NotFoundException("文章不存在");
+            var post = await PostService.GetAsync(p => p.Status == Status.Published && p.Id == id) ?? throw new NotFoundException("文章不存在");
             var start = DateTime.Today.AddDays(-7);
-            var comments = CommentService.GetQuery(c => c.PostId == post.Id && c.CommentDate > start).Select(c => new Item()
+            var comments = await CommentService.GetQuery(c => c.PostId == post.Id && c.CommentDate > start).Select(c => new Item()
             {
                 Author = new Author
                 {
@@ -220,10 +221,10 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Permalink = $"{scheme}://{host}/{post.Id}?cid={c.Id}#comment",
                 Guid = c.Id.ToString(),
                 FullHtmlContent = c.Content
-            }).FromCache(new MemoryCacheEntryOptions()
+            }).FromCacheAsync(new MemoryCacheEntryOptions()
             {
                 AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
-            }).ToList();
+            });
             var feed = new Feed()
             {
                 Title = Request.Host + $":文章【{post.Title}】文章评论更新订阅",

+ 12 - 10
src/Masuit.MyBlogs.Core/Controllers/SystemController.cs

@@ -305,10 +305,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <param name="content"></param>
         /// <returns></returns>
-        public ActionResult SetIpBlackList(string content)
+        public async Task<ActionResult> SetIpBlackList(string content)
         {
             CommonHelper.DenyIP = content + "";
-            System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "denyip.txt"), CommonHelper.DenyIP, Encoding.UTF8);
+            await System.IO.File.WriteAllTextAsync(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "denyip.txt"), CommonHelper.DenyIP, Encoding.UTF8);
             return ResultData(null);
         }
 
@@ -317,9 +317,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <param name="content"></param>
         /// <returns></returns>
-        public ActionResult SetIpWhiteList(string content)
+        public async Task<ActionResult> SetIpWhiteList(string content)
         {
-            System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory!, "App_Data", "whitelist.txt"), content, Encoding.UTF8);
+            await System.IO.File.WriteAllTextAsync(Path.Combine(AppDomain.CurrentDomain.BaseDirectory!, "App_Data", "whitelist.txt"), content, Encoding.UTF8);
             CommonHelper.IPWhiteList.Add(content);
             return ResultData(null);
         }
@@ -354,17 +354,18 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <param name="ip"></param>
         /// <returns></returns>
-        public ActionResult AddToWhiteList(string ip)
+        public async Task<ActionResult> AddToWhiteList(string ip)
         {
             if (!ip.MatchInetAddress())
             {
                 return ResultData(null, false);
             }
 
-            string ips = System.IO.File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "whitelist.txt"));
+            var basedir = AppDomain.CurrentDomain.BaseDirectory ?? Environment.CurrentDirectory;
+            string ips = await System.IO.File.ReadAllTextAsync(Path.Combine(basedir, "App_Data", "whitelist.txt"));
             List<string> list = ips.Split(',').Where(s => !string.IsNullOrEmpty(s)).ToList();
             list.Add(ip);
-            System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "whitelist.txt"), string.Join(",", list.Distinct()), Encoding.UTF8);
+            await System.IO.File.WriteAllTextAsync(Path.Combine(basedir, "App_Data", "whitelist.txt"), string.Join(",", list.Distinct()), Encoding.UTF8);
             CommonHelper.IPWhiteList = list;
             return ResultData(null);
         }
@@ -374,7 +375,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <param name="ip"></param>
         /// <returns></returns>
-        public ActionResult AddToBlackList(string ip)
+        public async Task<ActionResult> AddToBlackList(string ip)
         {
             if (!ip.MatchInetAddress())
             {
@@ -382,9 +383,10 @@ namespace Masuit.MyBlogs.Core.Controllers
             }
 
             CommonHelper.DenyIP += "," + ip;
-            System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "denyip.txt"), CommonHelper.DenyIP, Encoding.UTF8);
+            var basedir = AppDomain.CurrentDomain.BaseDirectory ?? Environment.CurrentDirectory;
+            await System.IO.File.WriteAllTextAsync(Path.Combine(basedir, "App_Data", "denyip.txt"), CommonHelper.DenyIP, Encoding.UTF8);
             CommonHelper.IPWhiteList.Remove(ip);
-            System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "whitelist.txt"), string.Join(",", CommonHelper.IPWhiteList.Distinct()), Encoding.UTF8);
+            await System.IO.File.WriteAllTextAsync(Path.Combine(basedir, "App_Data", "whitelist.txt"), string.Join(",", CommonHelper.IPWhiteList.Distinct()), Encoding.UTF8);
             return ResultData(null);
         }
 

+ 5 - 5
src/Masuit.MyBlogs.Core/Controllers/UploadController.cs

@@ -94,12 +94,12 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Content = html
             });
         }
-        private string ConvertToHtml(IFormFile file)
+        private async Task<string> ConvertToHtml(IFormFile file)
         {
-            using var ms = file.OpenReadStream();
-            using var fs = new FileStream(Path.Combine(Environment.GetEnvironmentVariable("temp") ??
+            await using var ms = file.OpenReadStream();
+            await using var fs = new FileStream(Path.Combine(Environment.GetEnvironmentVariable("temp") ??
                 "upload", file.FileName), FileMode.OpenOrCreate, FileAccess.ReadWrite);
-            ms.CopyTo(fs);
+            await ms.CopyToAsync(fs);
             using var doc = WordprocessingDocument.Open(fs, true);
             var pageTitle = file.FileName;
             var part = doc.CoreFilePropertiesPart;
@@ -130,7 +130,7 @@ namespace Masuit.MyBlogs.Core.Controllers
 
         private async Task<string> SaveAsHtml(IFormFile file)
         {
-            var html = ConvertToHtml(file);
+            var html = await ConvertToHtml(file);
             var doc = new HtmlDocument();
             doc.LoadHtml(html);
             var body = doc.DocumentNode.SelectSingleNode("//body");

+ 9 - 9
src/Masuit.MyBlogs.Core/Controllers/UserController.cs

@@ -19,16 +19,16 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <param name="username"></param>
         /// <returns></returns>
-        public ActionResult ChangeUsername(int id, string username)
+        public async Task<ActionResult> ChangeUsername(int id, string username)
         {
-            UserInfo userInfo = UserInfoService.GetById(id);
+            UserInfo userInfo = await UserInfoService.GetByIdAsync(id);
             if (!username.Equals(userInfo.Username) && UserInfoService.UsernameExist(username))
             {
                 return ResultData(null, false, $"用户名{username}已经存在,请尝试更换其他用户名!");
             }
 
             userInfo.Username = username;
-            bool b = UserInfoService.SaveChanges() > 0;
+            bool b = await UserInfoService.SaveChangesAsync() > 0;
             return ResultData(Mapper.Map<UserInfoDto>(userInfo), b, b ? $"用户名修改成功,新用户名为{username}。" : "用户名修改失败!");
         }
 
@@ -38,11 +38,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <param name="username"></param>
         /// <returns></returns>
-        public ActionResult ChangeNickName(int id, string username)
+        public async Task<ActionResult> ChangeNickName(int id, string username)
         {
-            UserInfo userInfo = UserInfoService.GetById(id);
+            UserInfo userInfo = await UserInfoService.GetByIdAsync(id);
             userInfo.NickName = username;
-            bool b = UserInfoService.SaveChanges() > 0;
+            bool b = await UserInfoService.SaveChangesAsync() > 0;
             return ResultData(Mapper.Map<UserInfoDto>(userInfo), b, b ? $"昵称修改成功,新昵称为{username}。" : "昵称修改失败!");
         }
 
@@ -83,11 +83,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <param name="path"></param>
         /// <returns></returns>
-        public ActionResult ChangeAvatar(int id, string path)
+        public async Task<ActionResult> ChangeAvatar(int id, string path)
         {
-            UserInfo userInfo = UserInfoService.GetById(id);
+            UserInfo userInfo = await UserInfoService.GetByIdAsync(id);
             userInfo.Avatar = path;
-            bool b = UserInfoService.SaveChanges() > 0;
+            bool b = await UserInfoService.SaveChangesAsync() > 0;
             return ResultData(Mapper.Map<UserInfoDto>(userInfo), b, b ? "头像修改成功。" : "头像修改失败!");
         }
 

+ 6 - 5
src/Masuit.MyBlogs.Core/Controllers/ValidateController.cs

@@ -3,6 +3,7 @@ using Masuit.MyBlogs.Core.Common;
 using Masuit.Tools;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -14,23 +15,23 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="email"></param>
         /// <returns></returns>
         [HttpPost, ValidateAntiForgeryToken, ResponseCache(Duration = 115, VaryByQueryKeys = new[] { "email" })]
-        public ActionResult SendCode(string email)
+        public async Task<ActionResult> SendCode(string email)
         {
             if (string.IsNullOrEmpty(email) || !email.MatchEmail().isMatch)
             {
                 return ResultData(null, false, "请输入正确的邮箱!");
             }
 
-            if (RedisHelper.Exists("get:" + email))
+            if (await RedisHelper.ExistsAsync("get:" + email))
             {
-                RedisHelper.Expire("get:" + email, 120);
+                await RedisHelper.ExpireAsync("get:" + email, 120);
                 return ResultData(null, false, "发送频率限制,请在2分钟后重新尝试发送邮件!请检查你的邮件,若未收到,请检查你的邮箱地址或邮件垃圾箱!");
             }
 
             string code = SnowFlake.GetInstance().GetUniqueShortId(6);
-            RedisHelper.Set("code:" + email, code, 86400);
+            await RedisHelper.SetAsync("code:" + email, code, 86400);
             BackgroundJob.Enqueue(() => CommonHelper.SendMail(Request.Host + "博客验证码", $"{Request.Host}本次验证码是:<span style='color:red'>{code}</span>,有效期为24h,请按时使用!", email));
-            RedisHelper.Set("get:" + email, code, 120);
+            await RedisHelper.SetAsync("get:" + email, code, 120);
 #if !DEBUG
             return ResultData(null, true, "验证码发送成功!");
 #else

+ 257 - 46
src/Masuit.MyBlogs.Core/Infrastructure/Repository/BaseRepository.cs

@@ -25,6 +25,10 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         public virtual DataContext DataContext { get; set; }
 
         public MapperConfiguration MapperConfig { get; set; }
+        public static MemoryCacheEntryOptions CacheOtions => new MemoryCacheEntryOptions()
+        {
+            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
+        };
 
         /// <summary>
         /// 获取所有实体
@@ -50,10 +54,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns>还未执行的SQL语句</returns>
         public virtual IEnumerable<T> GetAllFromCache()
         {
-            return DataContext.Set<T>().FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            });
+            return DataContext.Set<T>().FromCache(CacheOtions);
+        }
+
+        /// <summary>
+        /// 从二级缓存获取所有实体
+        /// </summary>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<T>> GetAllFromCacheAsync()
+        {
+            return DataContext.Set<T>().FromCacheAsync(CacheOtions);
         }
 
         /// <summary>
@@ -73,10 +83,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns>还未执行的SQL语句</returns>
         public virtual IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class
         {
-            return DataContext.Set<T>().AsNoTracking().ProjectTo<TDto>(MapperConfig).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            });
+            return DataContext.Set<T>().AsNoTracking().ProjectTo<TDto>(MapperConfig).FromCache(CacheOtions);
+        }
+
+        /// <summary>
+        /// 获取所有实体
+        /// </summary>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class
+        {
+            return DataContext.Set<T>().AsNoTracking().ProjectTo<TDto>(MapperConfig).FromCacheAsync(CacheOtions);
         }
 
         /// <summary>
@@ -112,10 +129,19 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns>还未执行的SQL语句</returns>
         public virtual IEnumerable<T> GetAllFromCache<TS>(Expression<Func<T, TS>> orderby, bool isAsc = true)
         {
-            return GetAll(orderby, isAsc).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            });
+            return GetAll(orderby, isAsc).FromCache(CacheOtions);
+        }
+
+        /// <summary>
+        /// 获取所有实体
+        /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        {
+            return GetAll(orderby, isAsc).FromCacheAsync(CacheOtions);
         }
 
         /// <summary>
@@ -141,10 +167,20 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns>还未执行的SQL语句</returns>
         public virtual IEnumerable<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> orderby, bool isAsc = true) where TDto : class
         {
-            return GetAllNoTracking(orderby, isAsc).ProjectTo<TDto>(MapperConfig).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            });
+            return GetAllNoTracking(orderby, isAsc).ProjectTo<TDto>(MapperConfig).FromCache(CacheOtions);
+        }
+
+        /// <summary>
+        /// 获取所有实体
+        /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        {
+            return GetAllNoTracking(orderby, isAsc).ProjectTo<TDto>(MapperConfig).FromCacheAsync(CacheOtions);
         }
 
         /// <summary>
@@ -177,10 +213,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns>还未执行的SQL语句</returns>
         public virtual IEnumerable<T> GetQueryFromCache(Expression<Func<T, bool>> where)
         {
-            return DataContext.Set<T>().Where(where).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            });
+            return DataContext.Set<T>().Where(where).FromCache(CacheOtions);
+        }
+
+        /// <summary>
+        /// 基本查询方法,获取一个集合,优先从二级缓存读取
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where)
+        {
+            return DataContext.Set<T>().Where(where).FromCacheAsync(CacheOtions);
         }
 
         /// <summary>
@@ -193,10 +236,34 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns>还未执行的SQL语句</returns>
         public virtual IEnumerable<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
         {
-            return GetQuery(where, orderby, isAsc).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            });
+            return GetQuery(where, orderby, isAsc).FromCache(CacheOtions);
+        }
+
+        /// <summary>
+        /// 基本查询方法,获取一个集合,优先从二级缓存读取
+        /// </summary>
+        /// <typeparam name="TS">排序字段</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序方式</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<T>> GetQueryFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        {
+            return GetQuery(where, orderby, isAsc).FromCacheAsync(CacheOtions);
+        }
+
+        /// <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<IEnumerable<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).FromCacheAsync(CacheOtions);
         }
 
         /// <summary>
@@ -253,10 +320,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns>实体集合</returns>
         public virtual IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> where) where TDto : class
         {
-            return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            });
+            return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig).FromCache(CacheOtions);
+        }
+
+        /// <summary>
+        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        {
+            return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig).FromCacheAsync(CacheOtions);
         }
 
         /// <summary>
@@ -270,10 +344,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <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
         {
-            return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            });
+            return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).FromCache(CacheOtions);
         }
 
         /// <summary>
@@ -296,6 +367,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return DataContext.Set<T>().Where(where).DeferredFirstOrDefault().Execute();
         }
 
+        /// <summary>
+        /// 获取第一条数据
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>实体</returns>
+        public Task<T> GetFromCacheAsync(Expression<Func<T, bool>> @where)
+        {
+            return DataContext.Set<T>().Where(where).DeferredFirstOrDefault().ExecuteAsync();
+        }
+
         /// <summary>
         /// 获取第一条数据
         /// </summary>
@@ -322,6 +403,33 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return isAsc ? DataContext.Set<T>().OrderBy(orderby).Where(where).DeferredFirstOrDefault().Execute() : DataContext.Set<T>().OrderByDescending(orderby).Where(where).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).DeferredFirstOrDefault().ExecuteAsync() : DataContext.Set<T>().OrderByDescending(orderby).Where(where).DeferredFirstOrDefault().ExecuteAsync();
+        }
+
+        /// <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<TDto> GetAsync<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).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefaultAsync() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefaultAsync();
+        }
+
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -336,14 +444,28 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             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>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>映射实体</returns>
+        public Task<TDto> GetFromCacheAsync<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().ExecuteAsync() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).ProjectTo<TDto>(MapperConfig).DeferredFirstOrDefault().ExecuteAsync();
+        }
+
         /// <summary>
         /// 获取第一条数据
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetAsync(Expression<Func<T, bool>> where)
+        public virtual Task<T> GetAsync(Expression<Func<T, bool>> where)
         {
-            return await DataContext.Set<T>().FirstOrDefaultAsync(where).ConfigureAwait(true);
+            return DataContext.Set<T>().FirstOrDefaultAsync(@where);
         }
 
         /// <summary>
@@ -402,6 +524,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             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>
@@ -421,9 +553,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> where)
+        public virtual Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> where)
         {
-            return await DataContext.Set<T>().AsNoTracking().FirstOrDefaultAsync(where).ConfigureAwait(true);
+            return DataContext.Set<T>().AsNoTracking().FirstOrDefaultAsync(@where);
         }
 
         /// <summary>
@@ -491,6 +623,39 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             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>还未执行的SQL语句</returns>
+        public 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);
+            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>还未执行的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
+        {
+            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);
+        }
+
         /// <summary>
         /// 高效分页查询方法(不跟踪实体)
         /// </summary>
@@ -716,7 +881,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="page">当前页</param>
         /// <param name="size">页大小</param>
         /// <returns></returns>
-        public static PagedList<T> ToCachedPagedList<T>(this IOrderedQueryable<T> query, int page, int size) where T : class
+        public static PagedList<T> ToCachedPagedList<T>(this IOrderedQueryable<T> query, int page, int size) where T : class, new()
         {
             var totalCount = query.Count();
             if (page * size > totalCount)
@@ -729,13 +894,35 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
                 page = 1;
             }
 
-            var list = query.Skip(size * (page - 1)).Take(size).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            }).ToList();
+            var list = query.Skip(size * (page - 1)).Take(size).FromCache(BaseRepository<T>.CacheOtions).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 : class, new()
+        {
+            var totalCount = query.Count();
+            if (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).FromCacheAsync(BaseRepository<T>.CacheOtions);
+            return new PagedList<T>(list.ToList(), page, size, totalCount);
+        }
+
         /// <summary>
         /// 生成分页集合
         /// </summary>
@@ -773,7 +960,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="size">页大小</param>
         /// <param name="mapper"></param>
         /// <returns></returns>
-        public static PagedList<TDto> ToCachedPagedList<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper) where TDto : class
+        public static PagedList<TDto> ToCachedPagedList<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper) where TDto : class where T : class, new()
         {
             var totalCount = query.Count();
             if (page * size > totalCount)
@@ -786,11 +973,35 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
                 page = 1;
             }
 
-            var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).FromCache(new MemoryCacheEntryOptions()
-            {
-                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
-            }).ToList();
+            var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).FromCache(BaseRepository<T>.CacheOtions).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 : class, new()
+        {
+            var totalCount = query.Count();
+            if (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).FromCacheAsync(BaseRepository<T>.CacheOtions);
+            return new PagedList<TDto>(list.ToList(), page, size, totalCount);
+        }
     }
 }

+ 138 - 3
src/Masuit.MyBlogs.Core/Infrastructure/Repository/Interface/IBaseRepository.cs

@@ -28,6 +28,12 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<T> GetAllFromCache();
 
+        /// <summary>
+        /// 从二级缓存获取所有实体
+        /// </summary>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<T>> GetAllFromCacheAsync();
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -42,6 +48,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class;
 
+        /// <summary>
+        /// 获取所有实体
+        /// </summary>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class;
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -69,6 +82,15 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</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>还未执行的SQL语句</returns>
+        Task<IEnumerable<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -89,6 +111,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<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>还未执行的SQL语句</returns>
+        Task<IEnumerable<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
@@ -132,6 +164,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<T> GetQueryFromCache(Expression<Func<T, bool>> @where);
 
+        /// <summary>
+        /// 基本查询方法,获取一个集合,优先从二级缓存读取
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where);
+
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
         /// </summary>
@@ -142,6 +181,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</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>还未执行的SQL语句</returns>
+        Task<IEnumerable<T>> GetQueryFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
@@ -149,6 +198,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
+        /// <summary>
+        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
@@ -160,6 +216,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>还未执行的SQL语句</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>
+        /// <typeparam name="TS">排序字段</typeparam>
+        /// <typeparam name="TDto">输出类型</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序方式</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<TDto>> GetQueryFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
         /// </summary>
@@ -191,6 +258,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>实体</returns>
         T GetFromCache(Expression<Func<T, bool>> @where);
 
+        /// <summary>
+        /// 获取第一条数据
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>实体</returns>
+        Task<T> GetFromCacheAsync(Expression<Func<T, bool>> @where);
+
         /// <summary>
         /// 获取第一条数据
         /// </summary>
@@ -211,6 +285,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <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>
@@ -225,6 +309,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <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>
@@ -236,6 +327,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>映射实体</returns>
         TDto Get<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<TDto> GetAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -247,6 +349,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <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>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>映射实体</returns>
+        Task<TDto> GetFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+
         /// <summary>
         /// 获取第一条数据
         /// </summary>
@@ -343,13 +456,24 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <typeparam name="TS"></typeparam>
         /// <param name="pageIndex">第几页</param>
         /// <param name="pageSize">每页大小</param>
-        /// <param name="totalCount">数据总数</param>
         /// <param name="where">where Lambda条件表达式</param>
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</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>还未执行的SQL语句</returns>
+        Task<PagedList<T>> GetPagesFromCacheAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> orderby, bool isAsc);
+
         /// <summary>
         /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
         /// </summary>
@@ -357,20 +481,31 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <typeparam name="TDto"></typeparam>
         /// <param name="pageIndex">第几页</param>
         /// <param name="pageSize">每页大小</param>
-        /// <param name="totalCount">数据总数</param>
         /// <param name="where">where Lambda条件表达式</param>
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
         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>还未执行的SQL语句</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>
         /// <param name="pageSize">每页大小</param>
-        /// <param name="totalCount">数据总数</param>
         /// <param name="where">where Lambda条件表达式</param>
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>

+ 183 - 0
src/Masuit.MyBlogs.Core/Infrastructure/Services/BaseService.cs

@@ -54,6 +54,15 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetAllFromCache();
         }
 
+        /// <summary>
+        /// 从二级缓存获取所有实体
+        /// </summary>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<T>> GetAllFromCacheAsync()
+        {
+            return BaseDal.GetAllFromCacheAsync();
+        }
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -74,6 +83,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetAllFromCache<TDto>();
         }
 
+        /// <summary>
+        /// 获取所有实体
+        /// </summary>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class
+        {
+            return BaseDal.GetAllFromCacheAsync<TDto>();
+        }
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -110,6 +129,18 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetAllFromCache(orderby, isAsc);
         }
 
+        /// <summary>
+        /// 获取所有实体
+        /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        {
+            return BaseDal.GetAllFromCacheAsync(orderby, isAsc);
+        }
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -136,6 +167,19 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             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<IEnumerable<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        {
+            return BaseDal.GetAllFromCacheAsync<TS, TDto>(orderby, isAsc);
+        }
+
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
@@ -194,6 +238,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetQueryFromCache(where);
         }
 
+        /// <summary>
+        /// 基本查询方法,获取一个集合,优先从二级缓存读取
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where)
+        {
+            return BaseDal.GetQueryFromCacheAsync(where);
+        }
+
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
         /// </summary>
@@ -207,6 +261,19 @@ 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<IEnumerable<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>
@@ -217,6 +284,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetQueryFromCache<TDto>(where);
         }
 
+        /// <summary>
+        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>还未执行的SQL语句</returns>
+        public Task<IEnumerable<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        {
+            return BaseDal.GetQueryFromCacheAsync<TDto>(where);
+        }
+
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
@@ -231,6 +308,20 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             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<IEnumerable<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>
@@ -274,6 +365,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetFromCache(where);
         }
 
+        /// <summary>
+        /// 获取第一条数据
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>实体</returns>
+        public Task<T> GetFromCacheAsync(Expression<Func<T, bool>> @where)
+        {
+            return BaseDal.GetFromCacheAsync(where);
+        }
+
         /// <summary>
         /// 获取第一条数据
         /// </summary>
@@ -300,6 +401,19 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             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>
@@ -320,6 +434,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             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>
@@ -334,6 +458,20 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.Get<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 Task<TDto> GetAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        {
+            return BaseDal.GetAsync<TS, TDto>(where, orderby, isAsc);
+        }
+
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -348,6 +486,20 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetFromCache<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 Task<TDto> GetFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        {
+            return BaseDal.GetFromCacheAsync<TS, TDto>(where, orderby, isAsc);
+        }
+
         /// <summary>
         /// 获取第一条数据
         /// </summary>
@@ -483,6 +635,21 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             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映射后的数据集合
         /// </summary>
@@ -499,6 +666,22 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return BaseDal.GetPagesFromCache<TS, TDto>(pageIndex, pageSize, where, orderby, isAsc);
         }
 
+        /// <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>

+ 5 - 4
src/Masuit.MyBlogs.Core/Infrastructure/Services/CategoryService.cs

@@ -3,6 +3,7 @@ using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
 using System.Linq;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Services
 {
@@ -18,10 +19,10 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="id"></param>
         /// <param name="mid"></param>
         /// <returns></returns>
-        public bool Delete(int id, int mid)
+        public async Task<bool> Delete(int id, int mid)
         {
-            var category = GetById(id);
-            var moveCat = GetById(mid);
+            var category = await GetByIdAsync(id);
+            var moveCat = await GetByIdAsync(mid);
             for (var j = 0; j < category.Post.Count; j++)
             {
                 var p = category.Post.ElementAt(j);
@@ -39,7 +40,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
                 moveCat.PostHistoryVersion.Add(p);
             }
 
-            bool b = DeleteByIdSaved(id);
+            bool b = await DeleteByIdSavedAsync(id) > 0;
             return b;
         }
     }

+ 138 - 0
src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/IBaseService.cs

@@ -27,6 +27,12 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<T> GetAllFromCache();
 
+        /// <summary>
+        /// 从二级缓存获取所有实体
+        /// </summary>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<T>> GetAllFromCacheAsync();
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -41,6 +47,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class;
 
+        /// <summary>
+        /// 获取所有实体
+        /// </summary>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<TDto>> GetAllFromCacheAsync<TDto>() where TDto : class;
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -68,6 +81,15 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</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>还未执行的SQL语句</returns>
+        Task<IEnumerable<T>> GetAllFromCacheAsync<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
+
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -88,6 +110,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<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>还未执行的SQL语句</returns>
+        Task<IEnumerable<TDto>> GetAllFromCacheAsync<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
@@ -130,6 +162,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<T> GetQueryFromCache(Expression<Func<T, bool>> @where);
 
+        /// <summary>
+        /// 基本查询方法,获取一个集合,优先从二级缓存读取
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<T>> GetQueryFromCacheAsync(Expression<Func<T, bool>> @where);
+
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
         /// </summary>
@@ -140,6 +179,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</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>还未执行的SQL语句</returns>
+        Task<IEnumerable<T>> GetQueryFromCacheAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
@@ -147,6 +196,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
+        /// <summary>
+        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<TDto>> GetQueryFromCacheAsync<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
@@ -158,6 +214,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</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>
+        /// <typeparam name="TS">排序字段</typeparam>
+        /// <typeparam name="TDto">输出类型</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序方式</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>还未执行的SQL语句</returns>
+        Task<IEnumerable<TDto>> GetQueryFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
         /// </summary>
@@ -189,6 +256,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>实体</returns>
         T GetFromCache(Expression<Func<T, bool>> @where);
 
+        /// <summary>
+        /// 获取第一条数据
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>实体</returns>
+        Task<T> GetFromCacheAsync(Expression<Func<T, bool>> @where);
+
         /// <summary>
         /// 获取第一条数据
         /// </summary>
@@ -209,6 +283,16 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <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>
@@ -223,6 +307,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <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>
@@ -234,6 +325,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>映射实体</returns>
         TDto Get<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<TDto> GetAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
@@ -245,6 +347,17 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <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>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>映射实体</returns>
+        Task<TDto> GetFromCacheAsync<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+
         /// <summary>
         /// 获取第一条数据
         /// </summary>
@@ -347,6 +460,18 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</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>还未执行的SQL语句</returns>
+        Task<PagedList<T>> GetPagesFromCacheAsync<TS>(int pageIndex, int pageSize, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc);
+
         /// <summary>
         /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
         /// </summary>
@@ -360,6 +485,19 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>还未执行的SQL语句</returns>
         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>还未执行的SQL语句</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>

+ 2 - 1
src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/ICategoryService.cs

@@ -1,4 +1,5 @@
 using Masuit.MyBlogs.Core.Models.Entity;
+using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
 {
@@ -10,6 +11,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="id"></param>
         /// <param name="mid"></param>
         /// <returns></returns>
-        bool Delete(int id, int mid);
+        Task<bool> Delete(int id, int mid);
     }
 }

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

@@ -16,6 +16,14 @@
         <StartupObject />
     </PropertyGroup>
 
+    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
+      <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    </PropertyGroup>
+
+    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+      <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    </PropertyGroup>
+
     <ItemGroup>
         <ProjectReference Include="..\..\..\Masuit.LuceneEFCore.SearchEngine\Masuit.LuceneEFCore.SearchEngine\Masuit.LuceneEFCore.SearchEngine.csproj" />
         <ProjectReference Include="..\..\..\Masuit.Tools\Masuit.Tools.Core\Masuit.Tools.Core.csproj" />

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

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

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

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

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Post/Publish.cshtml

@@ -3,7 +3,7 @@
 @{
     ViewBag.Title = "投稿";
     Layout = "~/Views/Shared/_Layout.cshtml";
-    List<Category> cats = ViewBag.Category;
+    IEnumerable<Category> cats = ViewBag.Category;
 }
 <link href="~/Assets/fileupload/filestyle.css" rel="stylesheet" />
 <link href="~/Assets/semantic/semantic.min.css" rel="stylesheet" />