Ver Fonte

代码重构

懒得勤快 há 6 anos atrás
pai
commit
2816b31a45
35 ficheiros alterados com 732 adições e 885 exclusões
  1. 3 3
      src/Masuit.MyBlogs.Core/Controllers/BannerController.cs
  2. 2 2
      src/Masuit.MyBlogs.Core/Controllers/BaseController.cs
  3. 2 2
      src/Masuit.MyBlogs.Core/Controllers/CategoryController.cs
  4. 26 72
      src/Masuit.MyBlogs.Core/Controllers/CommentController.cs
  5. 8 7
      src/Masuit.MyBlogs.Core/Controllers/DashboardController.cs
  6. 2 2
      src/Masuit.MyBlogs.Core/Controllers/DonateController.cs
  7. 8 9
      src/Masuit.MyBlogs.Core/Controllers/HomeController.cs
  8. 8 8
      src/Masuit.MyBlogs.Core/Controllers/LinksController.cs
  9. 1 1
      src/Masuit.MyBlogs.Core/Controllers/LoginController.cs
  10. 1 1
      src/Masuit.MyBlogs.Core/Controllers/MenuController.cs
  11. 4 4
      src/Masuit.MyBlogs.Core/Controllers/MergeController.cs
  12. 7 6
      src/Masuit.MyBlogs.Core/Controllers/MiscController.cs
  13. 10 10
      src/Masuit.MyBlogs.Core/Controllers/MsgController.cs
  14. 18 16
      src/Masuit.MyBlogs.Core/Controllers/NoticeController.cs
  15. 64 66
      src/Masuit.MyBlogs.Core/Controllers/PostController.cs
  16. 1 1
      src/Masuit.MyBlogs.Core/Controllers/SearchController.cs
  17. 13 11
      src/Masuit.MyBlogs.Core/Controllers/SeminarController.cs
  18. 1 1
      src/Masuit.MyBlogs.Core/Controllers/ShareController.cs
  19. 10 12
      src/Masuit.MyBlogs.Core/Controllers/SubscribeController.cs
  20. 2 3
      src/Masuit.MyBlogs.Core/Controllers/SystemController.cs
  21. 3 3
      src/Masuit.MyBlogs.Core/Controllers/UserController.cs
  22. 6 9
      src/Masuit.MyBlogs.Core/Extensions/Hangfire/HangfireBackJob.cs
  23. 82 150
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/BaseRepository.cs
  24. 56 96
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/Interface/IBaseRepository.cs
  25. 10 0
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/PostRepository.cs
  26. 210 0
      src/Masuit.MyBlogs.Core/Infrastructure/Repository/Repositories.cs
  27. 93 192
      src/Masuit.MyBlogs.Core/Infrastructure/Services/BaseService.cs
  28. 1 1
      src/Masuit.MyBlogs.Core/Infrastructure/Services/CategoryService.cs
  29. 2 2
      src/Masuit.MyBlogs.Core/Infrastructure/Services/CommentService.cs
  30. 56 124
      src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/IBaseService.cs
  31. 4 5
      src/Masuit.MyBlogs.Core/Infrastructure/Services/LeaveMessageService.cs
  32. 2 3
      src/Masuit.MyBlogs.Core/Infrastructure/Services/MenuService.cs
  33. 0 44
      src/Masuit.MyBlogs.Core/Infrastructure/Services/PostService.cs
  34. 3 3
      src/Masuit.MyBlogs.Core/Infrastructure/Services/UserInfoService.cs
  35. 13 16
      src/Masuit.MyBlogs.Core/Startup.cs

+ 3 - 3
src/Masuit.MyBlogs.Core/Controllers/BannerController.cs

@@ -21,9 +21,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// 获取全部
         /// </summary>
         /// <returns></returns>
-        public async Task<IActionResult> Get()
+        public IActionResult Get()
         {
-            return ResultData(await BannerService.GetAllFromL2CacheNoTracking(b => b.Id, false).ToListAsync());
+            return ResultData(BannerService.GetAllFromCache(b => b.Id, false));
         }
 
         /// <summary>
@@ -41,7 +41,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 entity.Description = banner.Description;
                 entity.ImageUrl = banner.ImageUrl;
                 entity.Title = banner.Title;
-                bool b1 = await BannerService.UpdateEntitySavedAsync(entity) > 0;
+                bool b1 = await BannerService.SaveChangesAsync() > 0;
                 return ResultData(null, b1, b1 ? "修改成功" : "修改失败");
             }
 

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

@@ -142,10 +142,10 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             #region 准备页面数据模型
 
-            ViewBag.menus = MenuService.LoadEntitiesFromL2Cache<MenuOutputDto>(m => m.Status == Status.Available).OrderBy(m => m.Sort).ToList(); //菜单
+            ViewBag.menus = MenuService.GetQueryFromCache<MenuOutputDto>(m => m.Status == Status.Available).OrderBy(m => m.Sort).ToList(); //菜单
             PageFootViewModel model = new PageFootViewModel //页脚
             {
-                Links = LinksService.LoadEntities(l => l.Status == Status.Available, l => l.Recommend, false).ThenByDescending(l => l.Weight).ThenByDescending(l => new Random().Next()).Take(40).ProjectTo<LinksOutputDto>(MapperConfig).Cacheable().ToList()
+                Links = LinksService.GetQuery(l => l.Status == Status.Available, l => l.Recommend, false).ThenByDescending(l => l.Weight).ThenByDescending(l => new Random().Next()).Take(40).ProjectTo<LinksOutputDto>(MapperConfig).Cacheable().ToList()
             };
             ViewBag.Footer = model;
 

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

@@ -26,7 +26,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [ResponseCache(Duration = 600)]
         public ActionResult GetCategories()
         {
-            var list = CategoryService.LoadEntities<string, CategoryOutputDto>(c => c.Status == Status.Available, c => c.Name).Cacheable().ToList();
+            var list = CategoryService.GetQuery<string, CategoryOutputDto>(c => c.Status == Status.Available, c => c.Name).Cacheable().ToList();
             return ResultData(list);
         }
 
@@ -73,7 +73,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             Category cat = CategoryService.GetById(dto.Id);
             cat.Name = dto.Name;
             cat.Description = dto.Description;
-            bool b = CategoryService.UpdateEntitySaved(cat);
+            bool b = CategoryService.SaveChanges() > 0;
             return ResultData(null, b, b ? "分类修改成功!" : "分类修改失败!");
         }
 

+ 26 - 72
src/Masuit.MyBlogs.Core/Controllers/CommentController.cs

@@ -155,7 +155,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpPost]
         public ActionResult CommentVote(int id)
         {
-            Comment cm = CommentService.GetFirstEntity(c => c.Id == id && c.Status == Status.Pended);
+            Comment cm = CommentService.Get(c => c.Id == id && c.Status == Status.Pended);
             if (HttpContext.Session.Get("cm" + id) != null)
             {
                 return ResultData(null, false, "您刚才已经投过票了,感谢您的参与!");
@@ -167,7 +167,6 @@ namespace Masuit.MyBlogs.Core.Controllers
             }
 
             cm.VoteCount++;
-            CommentService.UpdateEntity(cm);
             HttpContext.Session.Set("cm" + id, id.GetBytes());
             bool b = CommentService.SaveChanges() > 0;
             return ResultData(null, b, b ? "投票成功" : "投票失败");
@@ -202,7 +201,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     });
                 }
             }
-            var parent = CommentService.LoadPageEntities(page, size, out total, c => c.PostId == id && c.ParentId == 0 && (c.Status == Status.Pended || CurrentUser.IsAdmin), c => c.CommentDate, false).ToList();
+            var parent = CommentService.GetPagesFromCache(page, size, out total, c => c.PostId == id && c.ParentId == 0 && (c.Status == Status.Pended || CurrentUser.IsAdmin), c => c.CommentDate, false).ToList();
             if (!parent.Any())
             {
                 return ResultData(null, false, "没有评论");
@@ -222,56 +221,6 @@ namespace Masuit.MyBlogs.Core.Controllers
             return ResultData(null, false, "没有评论");
         }
 
-        /// <summary>
-        /// 分页获取评论
-        /// </summary>
-        /// <param name="page"></param>
-        /// <param name="size"></param>
-        /// <param name="cid"></param>
-        /// <returns></returns>
-        [HttpPost]
-        public ActionResult GetPageComments(int page = 1, int size = 5, int cid = 0)
-        {
-            int total; //总条数,用于前台分页
-            if (cid != 0)
-            {
-                int pid = CommentService.GetParentCommentIdByChildId(cid);
-                var single = CommentService.GetSelfAndAllChildrenCommentsByParentId(pid).ToList();
-                if (single.Any())
-                {
-                    total = 1;
-                    return ResultData(new
-                    {
-                        total,
-                        parentTotal = total,
-                        page,
-                        size,
-                        rows = single.Mapper<IList<CommentViewModel>>()
-                    });
-                }
-            }
-
-            var parent = CommentService.LoadPageEntities(page, size, out total, c => c.ParentId == 0 && (c.Status == Status.Pended || CurrentUser.IsAdmin), c => c.CommentDate, false).ToList();
-            if (!parent.Any())
-            {
-                return ResultData(null, false, "没有评论");
-            }
-
-            var qlist = parent.SelectMany(c => CommentService.GetSelfAndAllChildrenCommentsByParentId(c.Id)).Where(c => (c.Status == Status.Pended || CurrentUser.IsAdmin));
-            if (total > 0)
-            {
-                return ResultData(new
-                {
-                    total,
-                    parentTotal = total,
-                    page,
-                    size,
-                    rows = qlist.Mapper<IList<CommentViewModel>>()
-                });
-            }
-            return ResultData(null, false, "没有评论");
-        }
-
         /// <summary>
         /// 审核评论
         /// </summary>
@@ -283,26 +232,31 @@ namespace Masuit.MyBlogs.Core.Controllers
             Comment comment = CommentService.GetById(id);
             comment.Status = Status.Pended;
             Post post = PostService.GetById(comment.PostId);
-            bool b = CommentService.UpdateEntitySaved(comment);
-            var pid = comment.ParentId == 0 ? comment.Id : CommentService.GetParentCommentIdByChildId(id);
-#if !DEBUG
-            var content = System.IO.File.ReadAllText(Path.Combine(HostingEnvironment.WebRootPath, "template", "notify.html"))
-                .Replace("{{title}}", post.Title)
-                .Replace("{{time}}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
-                .Replace("{{nickname}}", comment.NickName)
-                .Replace("{{content}}", comment.Content);
-            var emails = CommentService.GetSelfAndAllChildrenCommentsByParentId(pid).Select(c => c.Email).Append(post.ModifierEmail).Except(new List<string> { comment.Email, CurrentUser.Email }).ToHashSet();
-            var link = Url.Action("Details", "Post", new
-            {
-                id = comment.PostId,
-                cid = pid
-            }, Request.Scheme) + "#comment";
-            foreach (var email in emails)
+            bool b = CommentService.SaveChanges() > 0;
+            if (b)
             {
-                BackgroundJob.Enqueue(() => CommonHelper.SendMail($"{Request.Host}{CommonHelper.SystemSettings["Title"]}文章评论回复:", content.Replace("{{link}}", link), email));
-            }
+                var pid = comment.ParentId == 0 ? comment.Id : CommentService.GetParentCommentIdByChildId(id);
+#if !DEBUG
+                var content = System.IO.File.ReadAllText(Path.Combine(HostingEnvironment.WebRootPath, "template", "notify.html"))
+                    .Replace("{{title}}", post.Title)
+                    .Replace("{{time}}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
+                    .Replace("{{nickname}}", comment.NickName)
+                    .Replace("{{content}}", comment.Content);
+                var emails = CommentService.GetSelfAndAllChildrenCommentsByParentId(pid).Select(c => c.Email).Append(post.ModifierEmail).Except(new List<string> { comment.Email, CurrentUser.Email }).ToHashSet();
+                var link = Url.Action("Details", "Post", new
+                {
+                    id = comment.PostId,
+                    cid = pid
+                }, Request.Scheme) + "#comment";
+                foreach (var email in emails)
+                {
+                    BackgroundJob.Enqueue(() => CommonHelper.SendMail($"{Request.Host}{CommonHelper.SystemSettings["Title"]}文章评论回复:", content.Replace("{{link}}", link), email));
+                }
 #endif
-            return ResultData(null, b, b ? "审核通过!" : "审核失败!");
+                return ResultData(null, true, "审核通过!");
+            }
+
+            return ResultData(null, false, "审核失败!");
         }
 
         /// <summary>
@@ -324,7 +278,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Authority]
         public ActionResult GetPendingComments(int page = 1, int size = 10)
         {
-            var list = CommentService.LoadPageEntities<DateTime, CommentOutputDto>(page, size, out int total, c => c.Status == Status.Pending, c => c.CommentDate, false).ToList();
+            var list = CommentService.GetPages<DateTime, CommentOutputDto>(page, size, out int total, c => c.Status == Status.Pending, c => c.CommentDate, false).ToList();
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
         }

+ 8 - 7
src/Masuit.MyBlogs.Core/Controllers/DashboardController.cs

@@ -1,4 +1,5 @@
-using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
+using EFSecondLevelCache.Core;
+using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.Tools.Logging;
 using Microsoft.AspNetCore.Mvc;
@@ -43,26 +44,26 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         public ActionResult GetMessages()
         {
-            var post = PostService.LoadEntitiesFromL2CacheNoTracking(p => p.Status == Status.Pending).Select(p => new
+            var post = PostService.GetQuery(p => p.Status == Status.Pending).Select(p => new
             {
                 p.Id,
                 p.Title,
                 p.PostDate,
                 p.Author
-            });
-            var msgs = LeaveMessageService.LoadEntitiesFromL2CacheNoTracking(m => m.Status == Status.Pending).Select(p => new
+            }).Cacheable();
+            var msgs = LeaveMessageService.GetQuery(m => m.Status == Status.Pending).Select(p => new
             {
                 p.Id,
                 p.PostDate,
                 p.NickName
-            });
-            var comments = CommentService.LoadEntitiesFromL2CacheNoTracking(c => c.Status == Status.Pending).Select(p => new
+            }).Cacheable();
+            var comments = CommentService.GetQuery(c => c.Status == Status.Pending).Select(p => new
             {
                 p.Id,
                 p.CommentDate,
                 p.PostId,
                 p.NickName
-            });
+            }).Cacheable();
             return ResultData(new
             {
                 post,

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

@@ -24,7 +24,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         public ActionResult GetPageData(int page = 1, int size = 10)
         {
-            var list = DonateService.LoadPageEntitiesFromL2CacheNoTracking(page, size, out int total, d => true, d => d.DonateTime, false).ToList();
+            var list = DonateService.GetPagesFromCache(page, size, out int total, d => true, d => d.DonateTime, false).ToList();
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
         }
@@ -63,7 +63,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 entry.QQorWechat = donate.QQorWechat;
                 entry.QQorWechatDisplay = donate.QQorWechatDisplay;
                 entry.Via = donate.Via;
-                b = DonateService.UpdateEntitySaved(entry);
+                b = DonateService.SaveChanges() > 0;
             }
             return ResultData(null, b, b ? "保存成功!" : "保存失败!");
         }

+ 8 - 9
src/Masuit.MyBlogs.Core/Controllers/HomeController.cs

@@ -3,7 +3,6 @@ using EFSecondLevelCache.Core;
 using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.DTO;
-using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.MyBlogs.Core.Models.ViewModel;
 using Microsoft.AspNetCore.Mvc;
@@ -56,8 +55,8 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ActionResult Index()
         {
             ViewBag.Total = PostService.Count(p => p.Status == Status.Pended || CurrentUser.IsAdmin);
-            var banners = BannerService.GetAllFromL2CacheNoTracking(b => new Random().Next()).ToList();
-            List<FastShare> fastShares = FastShareService.GetAllFromL2CacheNoTracking(s => s.Sort).ToList();
+            var banners = BannerService.GetAllFromCache().OrderBy(b => new Random().Next()).ToList();
+            var fastShares = FastShareService.GetAllFromCache(s => s.Sort).ToList();
             ViewBag.FastShare = fastShares;
             var viewModel = GetIndexPageViewModel(1, 15, OrderBy.ModifyDate, CurrentUser);
             viewModel.Banner = banners;
@@ -74,7 +73,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("p"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "page", "size", "orderBy" }, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult Post([Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")]int size = 15)
         {
-            ViewBag.Total = PostService.LoadEntitiesFromL2Cache<PostOutputDto>(p => p.Status == Status.Pended || CurrentUser.IsAdmin && !p.IsFixedTop).Count(p => !p.IsFixedTop);
+            ViewBag.Total = PostService.Count(p => p.Status == Status.Pended || CurrentUser.IsAdmin && !p.IsFixedTop);
             var viewModel = GetIndexPageViewModel(page, size, orderBy, CurrentUser);
             return View(viewModel);
         }
@@ -91,7 +90,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ActionResult Tag(string id, [Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")]int size = 15)
         {
             IList<PostOutputDto> posts;
-            var temp = PostService.LoadEntities<PostOutputDto>(p => p.Label.Contains(id) && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderByDescending(p => p.IsFixedTop);
+            var temp = PostService.GetQuery<PostOutputDto>(p => p.Label.Contains(id) && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderByDescending(p => p.IsFixedTop);
             switch (orderBy)
             {
                 case OrderBy.CommentCount:
@@ -133,7 +132,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Category(int id, [Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")]int size = 15)
         {
             var cat = await CategoryService.GetByIdAsync(id) ?? throw new NotFoundException("文章分类未找到");
-            var posts = PostService.LoadEntitiesNoTracking(p => p.CategoryId == cat.Id && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderByDescending(p => p.IsFixedTop);
+            var posts = PostService.GetQueryNoTracking(p => p.CategoryId == cat.Id && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderByDescending(p => p.IsFixedTop);
             ViewBag.Total = posts.Count();
             switch (orderBy)
             {
@@ -173,9 +172,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         private IndexPageViewModel GetIndexPageViewModel(int page, int size, OrderBy? orderBy, UserInfoOutputDto user)
         {
-            IQueryable<PostOutputDto> postsQuery = PostService.LoadEntities<PostOutputDto>(p => (p.Status == Status.Pended || user.IsAdmin)); //准备文章的查询
-            var notices = NoticeService.LoadPageEntitiesFromL2Cache<DateTime, NoticeOutputDto>(1, 5, out int _, n => (n.Status == Status.Display || user.IsAdmin), n => n.ModifyDate, false).ToList(); //加载前5条公告
-            var cats = CategoryService.LoadEntitiesFromL2Cache<string, CategoryOutputDto>(c => c.Status == Status.Available, c => c.Name).ToList(); //加载分类目录
+            IQueryable<PostOutputDto> postsQuery = PostService.GetQuery<PostOutputDto>(p => (p.Status == Status.Pended || user.IsAdmin)); //准备文章的查询
+            var notices = NoticeService.GetPagesFromCache<DateTime, NoticeOutputDto>(1, 5, out int _, n => (n.Status == Status.Display || user.IsAdmin), n => n.ModifyDate, false).ToList(); //加载前5条公告
+            var cats = CategoryService.GetQueryFromCache<string, CategoryOutputDto>(c => c.Status == Status.Available, c => c.Name).ToList(); //加载分类目录
             var hotSearches = RedisHelper.Get<List<KeywordsRankOutputDto>>("SearchRank:Week").Take(10).ToList(); //热词统计
             Expression<Func<PostOutputDto, double>> order = p => p.TotalViewCount;
             switch (new Random().Next() % 3)

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

@@ -30,7 +30,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("links"), ResponseCache(Duration = 600, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult Index()
         {
-            var list = LinksService.LoadEntities<object, LinksOutputDto>(l => l.Status == Status.Available, l => l.Recommend, false).ToList();
+            var list = LinksService.GetQueryFromCache<bool, LinksOutputDto>(l => l.Status == Status.Available, l => l.Recommend, false).ToList();
             return CurrentUser.IsAdmin ? View("Index_Admin", list) : View(list);
         }
 
@@ -73,7 +73,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     return ResultData(null, false, $"添加失败!检测到您的网站上未将本站设置成友情链接,请先将本站主域名:{CommonHelper.SystemSettings["Domain"]}在您的网站设置为友情链接,并且能够展示后,再次尝试添加即可!");
                 }
 
-                var entry = LinksService.GetFirstEntity(l => l.Url.Equals(links.Url));
+                var entry = LinksService.Get(l => l.Url.Equals(links.Url));
                 bool b;
                 if (entry is null)
                 {
@@ -85,7 +85,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     entry.Except = links.Except;
                     entry.Name = links.Name;
                     entry.Recommend = links.Recommend;
-                    b = LinksService.UpdateEntitySaved(entry);
+                    b = LinksService.SaveChanges() > 0;
                 }
 
                 return ResultData(null, b, b ? "添加成功!这可能有一定的延迟,如果没有看到您的链接,请稍等几分钟后刷新页面即可,如有疑问,请联系站长。" : "添加失败!这可能是由于网站服务器内部发生了错误,如有疑问,请联系站长。");
@@ -113,7 +113,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 entry.Except = links.Except;
                 entry.Name = links.Name;
                 entry.Recommend = links.Recommend;
-                b = LinksService.UpdateEntitySaved(entry);
+                b = LinksService.SaveChanges() > 0;
             }
 
             return b ? ResultData(null, message: "添加成功!") : ResultData(null, false, "添加失败!");
@@ -176,7 +176,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             Links links = LinksService.GetById(model.Id);
             links.Name = model.Name;
             links.Url = model.Url;
-            bool b = LinksService.UpdateEntitySaved(links);
+            bool b = LinksService.SaveChanges() > 0;
             return ResultData(null, b, b ? "保存成功" : "保存失败");
         }
 
@@ -202,7 +202,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             Links link = LinksService.GetById(id);
             link.Except = !state;
-            bool b = LinksService.UpdateEntitySaved(link);
+            bool b = LinksService.SaveChanges() > 0;
             return ResultData(null, b, b ? "切换成功!" : "切换失败!");
         }
 
@@ -217,7 +217,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             Links link = LinksService.GetById(id);
             link.Recommend = !state;
-            bool b = LinksService.UpdateEntitySaved(link);
+            bool b = LinksService.SaveChanges() > 0;
             return ResultData(null, b, b ? "切换成功!" : "切换失败!");
         }
 
@@ -232,7 +232,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             Links link = LinksService.GetById(id);
             link.Status = !state ? Status.Available : Status.Unavailable;
-            bool b = LinksService.UpdateEntitySaved(link);
+            bool b = LinksService.SaveChanges() > 0;
             return ResultData(null, b, b ? "切换成功!" : "切换失败!");
         }
     }

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

@@ -26,7 +26,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ActionResult GetRecentRecord(int id)
         {
             var time = DateTime.Now.AddMonths(-1);
-            var list = LoginRecordService.LoadEntitiesFromL2Cache<DateTime, LoginRecordOutputDto>(r => r.UserInfoId == id && r.LoginTime >= time, r => r.LoginTime, false).ToList();
+            var list = LoginRecordService.GetQueryFromCache<DateTime, LoginRecordOutputDto>(r => r.UserInfoId == id && r.LoginTime >= time, r => r.LoginTime, false).ToList();
             return ResultData(list);
         }
     }

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

@@ -84,7 +84,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 return ResultData(null, false, "添加失败");
             }
             Mapper.Map(model, m);
-            bool b = MenuService.UpdateEntitySaved(m);
+            bool b = MenuService.SaveChanges() > 0;
             return ResultData(null, b, b ? "修改成功" : "修改失败");
         }
     }

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

@@ -51,7 +51,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 where = where.And(r => r.Title.Contains(kw) || r.Content.Contains(kw) || r.Modifier.Contains(kw) || r.ModifierEmail.Contains(kw));
             }
 
-            var list = PostMergeRequestService.LoadEntities(where).OrderBy(d => d.MergeState).ThenByDescending(r => r.Id).Skip((page - 1) * size).Take(size).ProjectTo<PostMergeRequestOutputDtoBase>(MapperConfig).ToList();
+            var list = PostMergeRequestService.GetQuery(where).OrderBy(d => d.MergeState).ThenByDescending(r => r.Id).Skip((page - 1) * size).Take(size).ProjectTo<PostMergeRequestOutputDtoBase>(MapperConfig).ToList();
             var count = PostMergeRequestService.Count(where);
             var pageCount = Math.Ceiling(count * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, count);
@@ -89,7 +89,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             merge.Post.PostHistoryVersion.Add(history);
             merge.Post.ModifyDate = DateTime.Now;
             merge.MergeState = MergeStatus.Merged;
-            var b = PostMergeRequestService.UpdateEntitySaved(merge);
+            var b = PostMergeRequestService.SaveChanges() > 0;
             if (!b)
             {
                 return ResultData(null, false, "文章合并失败!");
@@ -112,7 +112,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var merge = PostMergeRequestService.GetById(dto.Id) ?? throw new NotFoundException("待合并文章未找到");
             Mapper.Map(dto, merge);
-            var b = PostMergeRequestService.UpdateEntitySaved(merge);
+            var b = PostMergeRequestService.SaveChanges() > 0;
             if (b)
             {
                 return Merge(merge.Id);
@@ -132,7 +132,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var merge = PostMergeRequestService.GetById(id) ?? throw new NotFoundException("待合并文章未找到");
             merge.MergeState = MergeStatus.Reject;
-            var b = PostMergeRequestService.UpdateEntitySaved(merge);
+            var b = PostMergeRequestService.SaveChanges() > 0;
             if (!b)
             {
                 return ResultData(null, false, "操作失败!");

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

@@ -1,4 +1,5 @@
-using Masuit.MyBlogs.Core.Common;
+using EFSecondLevelCache.Core;
+using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.DTO;
@@ -51,7 +52,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("misc/{id:int}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id" }, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult Index(int id)
         {
-            var misc = MiscService.GetById(id) ?? throw new NotFoundException("页面未找到");
+            var misc = MiscService.GetFromCache(m => m.Id == id) ?? throw new NotFoundException("页面未找到");
             return View(misc);
         }
 
@@ -74,7 +75,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("donatelist")]
         public ActionResult DonateList(int page = 1, int size = 10)
         {
-            var list = DonateService.LoadPageEntitiesFromL2CacheNoTracking(page, size, out int total, d => true, d => d.DonateTime, false).Select(d => new
+            var list = DonateService.GetPages(page, size, out int total, d => true, d => d.DonateTime, false).Select(d => new
             {
                 d.NickName,
                 d.EmailDisplay,
@@ -82,7 +83,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 d.DonateTime,
                 d.Amount,
                 d.Via
-            }).ToList();
+            }).Cacheable().ToList();
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
         }
@@ -166,7 +167,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             entity.ModifyDate = DateTime.Now;
             entity.Title = misc.Title;
             entity.Content = await _imagebedClient.ReplaceImgSrc(misc.Content.ClearImgAttributes());
-            bool b = MiscService.UpdateEntitySaved(entity);
+            bool b = MiscService.SaveChanges() > 0;
             return ResultData(null, b, b ? "修改成功" : "修改失败");
         }
 
@@ -179,7 +180,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Authority]
         public ActionResult GetPageData(int page = 1, int size = 10)
         {
-            var list = MiscService.LoadPageEntitiesNoTracking(page, size, out int total, n => true, n => n.ModifyDate, false).Select(m => new
+            var list = MiscService.GetPagesNoTracking(page, size, out int total, n => true, n => n.ModifyDate, false).Select(m => new
             {
                 m.Id,
                 m.Title,

+ 10 - 10
src/Masuit.MyBlogs.Core/Controllers/MsgController.cs

@@ -44,7 +44,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [ResponseCache(Duration = 600, VaryByHeader = HeaderNames.Cookie), Route("msg")]
         public ActionResult Index()
         {
-            ViewBag.TotalCount = LeaveMessageService.LoadEntitiesNoTracking(m => m.ParentId == 0 && m.Status == Status.Pended).Count();
+            ViewBag.TotalCount = LeaveMessageService.GetQueryNoTracking(m => m.ParentId == 0 && m.Status == Status.Pended).Count();
             return CurrentUser.IsAdmin ? View("Index_Admin") : View();
         }
 
@@ -75,7 +75,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     });
                 }
             }
-            var parent = LeaveMessageService.LoadPageEntitiesNoTracking(page, size, out total, m => m.ParentId == 0 && (m.Status == Status.Pended || CurrentUser.IsAdmin), m => m.PostDate, false);
+            var parent = LeaveMessageService.GetPagesNoTracking(page, size, out total, m => m.ParentId == 0 && (m.Status == Status.Pended || CurrentUser.IsAdmin), m => m.PostDate, false);
             if (!parent.Any())
             {
                 return ResultData(null, false, "没有留言");
@@ -197,7 +197,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var msg = LeaveMessageService.GetById(id);
             msg.Status = Status.Pended;
-            bool b = LeaveMessageService.UpdateEntitySaved(msg);
+            bool b = LeaveMessageService.SaveChanges() > 0;
 #if !DEBUG
             var pid = msg.ParentId == 0 ? msg.Id : LeaveMessageService.GetParentMessageIdByChildId(id);
             var content = System.IO.File.ReadAllText(Path.Combine(HostingEnvironment.WebRootPath, "template", "notify.html")).Replace("{{time}}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Replace("{{nickname}}", msg.NickName).Replace("{{content}}", msg.Content);
@@ -230,7 +230,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Authority]
         public ActionResult GetPendingMsgs(int page = 1, int size = 10)
         {
-            var list = LeaveMessageService.LoadPageEntities<DateTime, LeaveMessageOutputDto>(page, size, out int total, m => m.Status == Status.Pending, l => l.PostDate, false).ToList();
+            var list = LeaveMessageService.GetPages<DateTime, LeaveMessageOutputDto>(page, size, out int total, m => m.Status == Status.Pending, l => l.PostDate, false).ToList();
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
         }
@@ -247,7 +247,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var msg = MessageService.GetById(id);
             msg.Read = true;
-            MessageService.UpdateEntitySaved(msg);
+            MessageService.SaveChanges();
             return Content("ok");
         }
 
@@ -261,7 +261,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var msg = MessageService.GetById(id);
             msg.Read = false;
-            MessageService.UpdateEntitySaved(msg);
+            MessageService.SaveChanges();
             return Content("ok");
         }
 
@@ -286,7 +286,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Authority]
         public ActionResult GetInternalMsgs(int page = 1, int size = 10)
         {
-            IEnumerable<InternalMessage> msgs = MessageService.LoadPageEntitiesNoTracking(page, size, out int total, m => true, m => m.Time, false);
+            IEnumerable<InternalMessage> msgs = MessageService.GetPagesNoTracking(page, size, out int total, m => true, m => m.Time, false);
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(msgs, pageCount, total);
         }
@@ -298,7 +298,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Authority]
         public ActionResult GetUnreadMsgs()
         {
-            IEnumerable<InternalMessage> msgs = MessageService.LoadEntitiesNoTracking(m => !m.Read, m => m.Time, false);
+            IEnumerable<InternalMessage> msgs = MessageService.GetQueryNoTracking(m => !m.Read, m => m.Time, false);
             return ResultData(msgs);
         }
 
@@ -321,12 +321,12 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Authority]
         public ActionResult MarkRead(int id)
         {
-            var msgs = MessageService.LoadEntities(m => m.Id <= id).ToList();
+            var msgs = MessageService.GetQuery(m => m.Id <= id).ToList();
             foreach (var t in msgs)
             {
                 t.Read = true;
             }
-            MessageService.UpdateEntities(msgs);
+
             MessageService.SaveChanges();
             return ResultData(null);
         }

+ 18 - 16
src/Masuit.MyBlogs.Core/Controllers/NoticeController.cs

@@ -52,7 +52,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("notice"), ResponseCache(Duration = 60, VaryByQueryKeys = new[] { "page", "size", "id" }, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult Index(int page = 1, int size = 10, int id = 0)
         {
-            var list = NoticeService.LoadPageEntities<DateTime, NoticeOutputDto>(page, size, out var total, n => n.Status == Status.Display, n => n.ModifyDate, false).ToList();
+            var list = NoticeService.GetPages<DateTime, NoticeOutputDto>(page, size, out var total, n => n.Status == Status.Display, n => n.ModifyDate, false).ToList();
             ViewBag.Total = total;
             if (!CurrentUser.IsAdmin)
             {
@@ -144,7 +144,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             entity.ModifyDate = DateTime.Now;
             entity.Title = notice.Title;
             entity.Content = await _imagebedClient.ReplaceImgSrc(notice.Content.ClearImgAttributes());
-            bool b = NoticeService.UpdateEntitySaved(entity);
+            bool b = NoticeService.SaveChanges() > 0;
             return ResultData(null, b, b ? "修改成功" : "修改失败");
         }
 
@@ -156,7 +156,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         public ActionResult GetPageData(int page = 1, int size = 10)
         {
-            var list = NoticeService.LoadPageEntitiesNoTracking(page, size, out int total, n => true, n => n.ModifyDate, false).ToList();
+            var list = NoticeService.GetPagesNoTracking(page, size, out int total, n => true, n => n.ModifyDate, false).ToList();
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
         }
@@ -168,16 +168,17 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         public ActionResult Get(int id)
         {
-            var notice = NoticeService.GetById(id);
             if (HttpContext.Session.Get("notice" + id) != null)
             {
-                return ResultData(notice.MapTo<NoticeOutputDto>());
+                return ResultData(HttpContext.Session.Get<NoticeOutputDto>("notice" + id));
             }
 
+            var notice = NoticeService.GetById(id);
             notice.ViewCount += 1;
-            NoticeService.UpdateEntitySaved(notice);
-            HttpContext.Session.Set("notice" + id, id.GetBytes());
-            return ResultData(notice.MapTo<NoticeOutputDto>());
+            NoticeService.SaveChanges();
+            var dto = notice.MapTo<NoticeOutputDto>();
+            HttpContext.Session.Set("notice" + id, dto);
+            return ResultData(dto);
         }
 
         /// <summary>
@@ -187,21 +188,22 @@ namespace Masuit.MyBlogs.Core.Controllers
         [ResponseCache(Duration = 600, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult Last()
         {
-            var notice = NoticeService.GetFirstEntity(n => n.Status == Status.Display, n => n.ModifyDate, false);
-            if (notice == null)
+            if (HttpContext.Session.Get("last-notice") != null)
             {
-                return ResultData(null, false);
+                return ResultData(HttpContext.Session.Get<NoticeOutputDto>("last-notice"));
             }
 
-            if (HttpContext.Session.Get("notice" + notice.Id) != null)
+            var notice = NoticeService.Get(n => n.Status == Status.Display, n => n.ModifyDate, false);
+            if (notice == null)
             {
-                return ResultData(notice.Mapper<NoticeOutputDto>());
+                return ResultData(null, false);
             }
 
             notice.ViewCount += 1;
-            NoticeService.UpdateEntitySaved(notice);
-            HttpContext.Session.Set("notice" + notice.Id, notice.Id.GetBytes());
-            return ResultData(notice.Mapper<NoticeOutputDto>());
+            NoticeService.SaveChanges();
+            var dto = notice.Mapper<NoticeOutputDto>();
+            HttpContext.Session.Set("last-notice", dto);
+            return ResultData(dto);
         }
     }
 }

+ 64 - 66
src/Masuit.MyBlogs.Core/Controllers/PostController.cs

@@ -71,11 +71,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("{id:int}/{kw}"), Route("{id:int}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id" }, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult Details(int id, string kw)
         {
-            var post = PostService.GetFirstEntity(p => p.Id == id && (p.Status == Status.Pended || CurrentUser.IsAdmin)) ?? throw new NotFoundException("文章未找到");
+            var post = PostService.Get(p => p.Id == id && (p.Status == Status.Pended || CurrentUser.IsAdmin)) ?? throw new NotFoundException("文章未找到");
             ViewBag.Keyword = post.Keyword + "," + post.Label;
             var modifyDate = post.ModifyDate;
-            ViewBag.Next = PostService.GetFirstEntity<DateTime, PostModelBase>(p => p.ModifyDate > modifyDate && (p.Status == Status.Pended || CurrentUser.IsAdmin), p => p.ModifyDate);
-            ViewBag.Prev = PostService.GetFirstEntity<DateTime, PostModelBase>(p => p.ModifyDate < modifyDate && (p.Status == Status.Pended || CurrentUser.IsAdmin), p => p.ModifyDate, false);
+            ViewBag.Next = PostService.GetFromCache<DateTime, PostModelBase>(p => p.ModifyDate > modifyDate && (p.Status == Status.Pended || CurrentUser.IsAdmin), p => p.ModifyDate);
+            ViewBag.Prev = PostService.GetFromCache<DateTime, PostModelBase>(p => p.ModifyDate < modifyDate && (p.Status == Status.Pended || CurrentUser.IsAdmin), p => p.ModifyDate, false);
             if (!string.IsNullOrEmpty(kw))
             {
                 ViewData["keywords"] = post.Content.Contains(kw) ? $"['{kw}']" : SearchEngine.LuceneIndexSearcher.CutKeywords(kw).ToJsonString();
@@ -105,9 +105,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("{id:int}/history"), Route("{id:int}/history/{page:int}/{size:int}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id", "page", "size" }, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult History(int id, int page = 1, int size = 20)
         {
-            var post = PostService.GetFirstEntity(p => p.Id == id && (p.Status == Status.Pended || CurrentUser.IsAdmin)).Mapper<PostOutputDto>() ?? throw new NotFoundException("文章未找到");
+            var post = PostService.GetFromCache(p => p.Id == id && (p.Status == Status.Pended || CurrentUser.IsAdmin)).Mapper<PostOutputDto>() ?? throw new NotFoundException("文章未找到");
             ViewBag.Primary = post;
-            var list = PostHistoryVersionService.LoadPageEntitiesNoTracking(page, size, out int total, v => v.PostId == id, v => v.ModifyDate, false).Cacheable().ToList();
+            var list = PostHistoryVersionService.GetPagesFromCache(page, size, out int total, v => v.PostId == id, v => v.ModifyDate, false).ToList();
             ViewBag.Total = total;
             ViewBag.PageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return View(list);
@@ -122,9 +122,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("{id:int}/history/{hid:int}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id", "hid" }, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult HistoryVersion(int id, int hid)
         {
-            var post = PostHistoryVersionService.GetById(hid) ?? throw new NotFoundException("文章未找到");
-            ViewBag.Next = PostHistoryVersionService.GetFirstEntityNoTracking(p => p.PostId == id && p.ModifyDate > post.ModifyDate, p => p.ModifyDate);
-            ViewBag.Prev = PostHistoryVersionService.GetFirstEntityNoTracking(p => p.PostId == id && p.ModifyDate < post.ModifyDate, p => p.ModifyDate, false);
+            var post = PostHistoryVersionService.GetFromCache(v => v.Id == hid) ?? throw new NotFoundException("文章未找到");
+            ViewBag.Next = PostHistoryVersionService.GetFromCache(p => p.PostId == id && p.ModifyDate > post.ModifyDate, p => p.ModifyDate);
+            ViewBag.Prev = PostHistoryVersionService.GetFromCache(p => p.PostId == id && p.ModifyDate < post.ModifyDate, p => p.ModifyDate, false);
             return CurrentUser.IsAdmin ? View("HistoryVersion_Admin", post) : View(post);
         }
 
@@ -138,9 +138,9 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("{id:int}/history/{v1:int}-{v2:int}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id", "v1", "v2" }, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult CompareVersion(int id, int v1, int v2)
         {
-            var main = PostService.GetFirstEntity(p => p.Id == id && (p.Status == Status.Pended || CurrentUser.IsAdmin)).Mapper<PostHistoryVersion>() ?? throw new NotFoundException("文章未找到");
-            var left = v1 <= 0 ? main : PostHistoryVersionService.GetById(v1) ?? throw new NotFoundException("文章未找到");
-            var right = v2 <= 0 ? main : PostHistoryVersionService.GetById(v2) ?? throw new NotFoundException("文章未找到");
+            var main = PostService.GetFromCache(p => p.Id == id && (p.Status == Status.Pended || CurrentUser.IsAdmin)).Mapper<PostHistoryVersion>() ?? throw new NotFoundException("文章未找到");
+            var left = v1 <= 0 ? main : PostHistoryVersionService.GetFromCache(v => v.Id == v1) ?? throw new NotFoundException("文章未找到");
+            var right = v2 <= 0 ? main : PostHistoryVersionService.GetFromCache(v => v.Id == v2) ?? throw new NotFoundException("文章未找到");
             main.Id = id;
             var diff = new HtmlDiff.HtmlDiff(right.Content, left.Content);
             var diffOutput = diff.Build();
@@ -156,12 +156,12 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         public ActionResult VoteDown(int id)
         {
-            Post post = PostService.GetById(id);
             if (HttpContext.Session.Get("post-vote" + id) != null)
             {
                 return ResultData(null, false, "您刚才已经投过票了,感谢您的参与!");
             }
 
+            Post post = PostService.GetById(id);
             if (post == null)
             {
                 return ResultData(null, false, "非法操作");
@@ -169,7 +169,6 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             HttpContext.Session.Set("post-vote" + id, id.GetBytes());
             post.VoteDownCount += 1;
-            PostService.UpdateEntity(post);
             var b = PostService.SaveChanges() > 0;
             return ResultData(null, b, b ? "投票成功!" : "投票失败!");
 
@@ -182,12 +181,12 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         public ActionResult VoteUp(int id)
         {
-            Post post = PostService.GetById(id);
             if (HttpContext.Session.Get("post-vote" + id) != null)
             {
                 return ResultData(null, false, "您刚才已经投过票了,感谢您的参与!");
             }
 
+            Post post = PostService.GetById(id);
             if (post == null)
             {
                 return ResultData(null, false, "非法操作");
@@ -195,7 +194,6 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             HttpContext.Session.Set("post-vote" + id, id.GetBytes());
             post.VoteUpCount += 1;
-            PostService.UpdateEntity(post);
             var b = PostService.SaveChanges() > 0;
             return ResultData(null, b, b ? "投票成功!" : "投票失败!");
 
@@ -207,8 +205,8 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         public ActionResult Publish()
         {
-            var list = PostService.LoadEntities(p => !string.IsNullOrEmpty(p.Label)).Select(p => p.Label).Distinct().SelectMany(s => s.Split(',', ',')).OrderBy(s => s).ToHashSet();
-            ViewBag.Category = CategoryService.LoadEntitiesNoTracking(c => c.Status == Status.Available).ToList();
+            var list = PostService.GetQuery(p => !string.IsNullOrEmpty(p.Label)).Select(p => p.Label).Distinct().SelectMany(s => s.Split(',', ',')).OrderBy(s => s).Cacheable().ToHashSet();
+            ViewBag.Category = CategoryService.GetQueryFromCache(c => c.Status == Status.Available).ToList();
             return View(list);
         }
 
@@ -241,7 +239,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             post.PostDate = DateTime.Now;
             post.ModifyDate = DateTime.Now;
             post.Content = await _imagebedClient.ReplaceImgSrc(post.Content.HtmlSantinizerStandard().ClearImgAttributes());
-            ViewBag.CategoryId = new SelectList(CategoryService.LoadEntitiesNoTracking(c => c.Status == Status.Available), "Id", "Name", post.CategoryId);
+            ViewBag.CategoryId = new SelectList(CategoryService.GetQueryNoTracking(c => c.Status == Status.Available), "Id", "Name", post.CategoryId);
             Post p = post.Mapper<Post>();
             p.IP = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
             p.Modifier = p.Author;
@@ -268,7 +266,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [ResponseCache(Duration = 600, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult GetTag()
         {
-            var list = PostService.LoadEntities(p => !string.IsNullOrEmpty(p.Label)).Select(p => p.Label).Distinct().SelectMany(s => s.Split(',', ',')).OrderBy(s => s).ToHashSet();
+            var list = PostService.GetQuery(p => !string.IsNullOrEmpty(p.Label)).Select(p => p.Label).Distinct().SelectMany(s => s.Split(',', ',')).OrderBy(s => s).Cacheable().ToHashSet();
             return ResultData(list);
         }
 
@@ -279,20 +277,20 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("all"), ResponseCache(Duration = 600, VaryByHeader = HeaderNames.Cookie)]
         public ActionResult All()
         {
-            var tags = PostService.LoadEntities(p => !string.IsNullOrEmpty(p.Label)).Select(p => p.Label).SelectMany(s => s.Split(',', ',')).OrderBy(s => s).ToList(); //tag
+            var tags = PostService.GetQuery(p => !string.IsNullOrEmpty(p.Label)).Select(p => p.Label).Cacheable().SelectMany(s => s.Split(',', ',')).OrderBy(s => s).ToList(); //tag
             ViewBag.tags = tags.GroupBy(t => t).OrderByDescending(g => g.Count()).ThenBy(g => g.Key);
             ViewBag.cats = CategoryService.GetAll(c => c.Post.Count, false).Select(c => new TagCloudViewModel
             {
                 Id = c.Id,
                 Name = c.Name,
                 Count = c.Post.Count(p => p.Status == Status.Pended || CurrentUser.IsAdmin)
-            }).ToList(); //category
+            }).Cacheable().ToList(); //category
             ViewBag.seminars = SeminarService.GetAll(c => c.Post.Count, false).Select(c => new TagCloudViewModel
             {
                 Id = c.Id,
                 Name = c.Title,
                 Count = c.Post.Count(p => p.Post.Status == Status.Pended || CurrentUser.IsAdmin)
-            }).ToList(); //seminars
+            }).Cacheable().ToList(); //seminars
             return View();
         }
 
@@ -413,7 +411,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Mapper.Map(dto, post);
                 post.PostHistoryVersion.Add(history);
                 post.ModifyDate = DateTime.Now;
-                return PostService.UpdateEntitySaved(post) ? ResultData(null, true, "你是文章原作者,无需审核,文章已自动更新并在首页展示!") : ResultData(null, false, "操作失败!");
+                return PostService.SaveChanges() > 0 ? ResultData(null, true, "你是文章原作者,无需审核,文章已自动更新并在首页展示!") : ResultData(null, false, "操作失败!");
             }
 
             #endregion
@@ -431,7 +429,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 post.PostMergeRequests.Add(merge);
             }
 
-            var b = PostService.UpdateEntitySaved(post);
+            var b = PostService.SaveChanges() > 0;
             if (!b)
             {
                 return ResultData(null, b, b ? "您的修改请求已提交,已进入审核状态,感谢您的参与!" : "操作失败!");
@@ -462,7 +460,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             Post post = PostService.GetById(id);
             post.IsFixedTop = !post.IsFixedTop;
-            bool b = PostService.UpdateEntitySaved(post);
+            bool b = PostService.SaveChanges() > 0;
             if (b)
             {
                 return ResultData(null, true, post.IsFixedTop ? "置顶成功!" : "取消置顶成功!");
@@ -483,7 +481,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             post.Status = Status.Pended;
             post.ModifyDate = DateTime.Now;
             post.PostDate = DateTime.Now;
-            bool b = PostService.UpdateEntitySaved(post);
+            bool b = PostService.SaveChanges() > 0;
             if (!b)
             {
                 return ResultData(null, false, "审核失败!");
@@ -494,7 +492,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 return ResultData(null, true, "审核通过!");
             }
 
-            var cast = BroadcastService.LoadEntities(c => c.Status == Status.Subscribed).ToList();
+            var cast = BroadcastService.GetQuery(c => c.Status == Status.Subscribed).ToList();
             var link = Request.Scheme + "://" + Request.Host + "/" + id;
             cast.ForEach(c =>
             {
@@ -529,7 +527,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var post = PostService.GetById(id);
             post.Status = Status.Deleted;
-            bool b = PostService.UpdateEntitySaved(post);
+            bool b = PostService.SaveChanges() > 0;
             SearchEngine.LuceneIndexer.Delete(post);
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
@@ -544,7 +542,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var post = PostService.GetById(id);
             post.Status = Status.Pended;
-            bool b = PostService.UpdateEntitySaved(post);
+            bool b = PostService.SaveChanges() > 0;
             return ResultData(null, b, b ? "恢复成功!" : "恢复失败!");
         }
 
@@ -623,7 +621,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         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 = "")
         {
             IOrderedQueryable<Post> temp;
-            var query = string.IsNullOrEmpty(kw) ? PostService.GetAll() : PostService.LoadEntities(p => p.Title.Contains(kw) || p.Author.Contains(kw) || p.Email.Contains(kw) || p.Label.Contains(kw) || p.Content.Contains(kw));
+            var query = string.IsNullOrEmpty(kw) ? PostService.GetAll() : PostService.GetQuery(p => p.Title.Contains(kw) || p.Author.Contains(kw) || p.Email.Contains(kw) || p.Label.Contains(kw) || p.Content.Contains(kw));
             var total = query.Count();
             var order = query.OrderByDescending(p => p.Status).ThenByDescending(p => p.IsFixedTop);
             switch (orderby)
@@ -669,7 +667,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 temp = PostService.LoadPageEntitiesNoTracking(page, size, out var total, where, p => p.Id);
+            var temp = PostService.GetPagesNoTracking(page, size, out var total, where, p => p.Id);
             var list = temp.OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.ModifyDate).ProjectTo<PostDataModel>(MapperConfig).ToList();
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
@@ -734,7 +732,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 p.Seminar.Clear();
                 tmp.ForEach(s =>
                 {
-                    var seminar = SeminarService.GetFirstEntity(e => e.Title.Equals(s));
+                    var seminar = SeminarService.Get(e => e.Title.Equals(s));
                     if (seminar != null)
                     {
                         p.Seminar.Add(new SeminarPost()
@@ -748,39 +746,39 @@ namespace Masuit.MyBlogs.Core.Controllers
                 });
             }
 
-            bool b = PostService.UpdateEntitySaved(p);
-            if (b)
+            bool b = PostService.SaveChanges() > 0;
+            if (!b)
             {
+                return ResultData(null, false, "文章修改失败!");
+            }
+
 #if !DEBUG
-                if (notify && "false" == CommonHelper.SystemSettings["DisabledEmailBroadcast"])
+            if (notify && "false" == CommonHelper.SystemSettings["DisabledEmailBroadcast"])
+            {
+                var cast = BroadcastService.GetQuery(c => c.Status == Status.Subscribed).ToList();
+                string link = Request.Scheme + "://" + Request.Host + "/" + p.Id;
+                cast.ForEach(c =>
                 {
-                    var cast = BroadcastService.LoadEntities(c => c.Status == Status.Subscribed).ToList();
-                    string link = Request.Scheme + "://" + Request.Host + "/" + p.Id;
-                    cast.ForEach(c =>
-                    {
-                        var ts = DateTime.Now.GetTotalMilliseconds();
-                        string content = System.IO.File.ReadAllText(Path.Combine(HostingEnvironment.WebRootPath, "template", "broadcast.html"))
-                            .Replace("{{link}}", link + "?email=" + c.Email)
-                            .Replace("{{time}}", post.ModifyDate.ToString("yyyy-MM-dd HH:mm:ss"))
-                            .Replace("{{title}}", post.Title)
-                            .Replace("{{author}}", post.Author)
-                            .Replace("{{content}}", post.Content.RemoveHtmlTag(150))
-                            .Replace("{{cancel}}", Url.Action("Subscribe", "Subscribe", new
-                            {
-                                c.Email,
-                                act = "cancel",
-                                validate = c.ValidateCode,
-                                timespan = ts,
-                                hash = (c.Email + "cancel" + c.ValidateCode + ts).AESEncrypt(AppConfig.BaiduAK)
-                            }, Request.Scheme));
-                        BackgroundJob.Schedule(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Title"] + "博客有新文章发布了", content, c.Email), (p.ModifyDate - DateTime.Now));
-                    });
-                }
-#endif
-                return ResultData(p.Mapper<PostOutputDto>(), message: "文章修改成功!");
+                    var ts = DateTime.Now.GetTotalMilliseconds();
+                    string content = System.IO.File.ReadAllText(Path.Combine(HostingEnvironment.WebRootPath, "template", "broadcast.html"))
+                        .Replace("{{link}}", link + "?email=" + c.Email)
+                        .Replace("{{time}}", post.ModifyDate.ToString("yyyy-MM-dd HH:mm:ss"))
+                        .Replace("{{title}}", post.Title)
+                        .Replace("{{author}}", post.Author)
+                        .Replace("{{content}}", post.Content.RemoveHtmlTag(150))
+                        .Replace("{{cancel}}", Url.Action("Subscribe", "Subscribe", new
+                        {
+                            c.Email,
+                            act = "cancel",
+                            validate = c.ValidateCode,
+                            timespan = ts,
+                            hash = (c.Email + "cancel" + c.ValidateCode + ts).AESEncrypt(AppConfig.BaiduAK)
+                        }, Request.Scheme));
+                    BackgroundJob.Schedule(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Title"] + "博客有新文章发布了", content, c.Email), (p.ModifyDate - DateTime.Now));
+                });
             }
-
-            return ResultData(null, false, "文章修改失败!");
+#endif
+            return ResultData(p.Mapper<PostOutputDto>(), message: "文章修改成功!");
         }
 
         /// <summary>
@@ -871,7 +869,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             {
                 return ResultData(null, true, "文章发表成功!");
             }
-            var cast = BroadcastService.LoadEntities(c => c.Status == Status.Subscribed).ToList();
+            var cast = BroadcastService.GetQuery(c => c.Status == Status.Subscribed).ToList();
             string link = Request.Scheme + "://" + Request.Host + "/" + p.Id;
             cast.ForEach(c =>
             {
@@ -912,7 +910,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 SeminarId = seminar.Id,
                 PostId = post.Id
             });
-            bool b = PostService.UpdateEntitySaved(post);
+            bool b = PostService.SaveChanges() > 0;
             return ResultData(null, b, b ? $"已将文章【{post.Title}】添加到专题【{seminar.Title}】" : "添加失败");
         }
 
@@ -934,7 +932,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 SeminarId = seminar.Id,
                 PostId = post.Id
             });
-            bool b = PostService.UpdateEntitySaved(post);
+            bool b = PostService.SaveChanges() > 0;
             return ResultData(null, b, b ? $"已将文章【{post.Title}】从【{seminar.Title}】专题移除" : "添加失败");
         }
 
@@ -981,7 +979,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     SeminarId = s.SeminarId
                 });
             }
-            bool b = PostHistoryVersionService.UpdateEntitySaved(history);
+            bool b = PostHistoryVersionService.SaveChanges() > 0;
             PostHistoryVersionService.DeleteByIdSaved(id);
             return ResultData(null, b, b ? "回滚成功" : "回滚失败");
 
@@ -999,7 +997,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             if (post != null)
             {
                 post.DisableComment = !post.DisableComment;
-                return ResultData(null, PostService.UpdateEntitySaved(post), post.DisableComment ? $"已禁用【{post.Title}】这篇文章的评论功能!" : $"已启用【{post.Title}】这篇文章的评论功能!");
+                return ResultData(null, PostService.SaveChanges() > 0, post.DisableComment ? $"已禁用【{post.Title}】这篇文章的评论功能!" : $"已启用【{post.Title}】这篇文章的评论功能!");
             }
 
             return ResultData(null, false, "文章不存在");

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

@@ -100,7 +100,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ActionResult SearchList(int page = 1, int size = 10, string search = "")
         {
             var where = string.IsNullOrEmpty(search) ? (Expression<Func<SearchDetails, bool>>)(s => true) : s => s.KeyWords.Contains(search);
-            var list = SearchDetailsService.LoadPageEntities<DateTime, SearchDetailsOutputDto>(page, size, out int total, where, s => s.SearchTime, false).ToList();
+            var list = SearchDetailsService.GetPages<DateTime, SearchDetailsOutputDto>(page, size, out int total, where, s => s.SearchTime, false).ToList();
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
         }

+ 13 - 11
src/Masuit.MyBlogs.Core/Controllers/SeminarController.cs

@@ -1,4 +1,5 @@
-using Masuit.MyBlogs.Core.Common;
+using EFSecondLevelCache.Core;
+using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.DTO;
@@ -9,6 +10,7 @@ using Microsoft.Net.Http.Headers;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.InteropServices;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -38,27 +40,27 @@ 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 = HeaderNames.Cookie)]
-        public ActionResult Index(int id, int page = 1, int size = 15, OrderBy orderBy = OrderBy.ModifyDate)
+        public ActionResult Index(int id, [Optional]OrderBy? orderBy, int page = 1, int size = 15)
         {
             IList<Post> posts;
             var s = SeminarService.GetById(id) ?? throw new NotFoundException("文章未找到");
-            var temp = PostService.LoadEntities(p => p.Seminar.Any(x => x.SeminarId == id) && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderByDescending(p => p.IsFixedTop);
+            var temp = PostService.GetQuery(p => p.Seminar.Any(x => x.SeminarId == id) && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderByDescending(p => p.IsFixedTop);
             switch (orderBy)
             {
                 case OrderBy.CommentCount:
-                    posts = temp.ThenByDescending(p => p.Comment.Count).Skip(size * (page - 1)).Take(size).ToList();
+                    posts = temp.ThenByDescending(p => p.Comment.Count).Skip(size * (page - 1)).Take(size).Cacheable().ToList();
                     break;
                 case OrderBy.PostDate:
-                    posts = temp.ThenByDescending(p => p.PostDate).Skip(size * (page - 1)).Take(size).ToList();
+                    posts = temp.ThenByDescending(p => p.PostDate).Skip(size * (page - 1)).Take(size).Cacheable().ToList();
                     break;
                 case OrderBy.ViewCount:
-                    posts = temp.ThenByDescending(p => p.TotalViewCount).Skip(size * (page - 1)).Take(size).ToList();
+                    posts = temp.ThenByDescending(p => p.TotalViewCount).Skip(size * (page - 1)).Take(size).Cacheable().ToList();
                     break;
                 case OrderBy.VoteCount:
-                    posts = temp.ThenByDescending(p => p.VoteUpCount).Skip(size * (page - 1)).Take(size).ToList();
+                    posts = temp.ThenByDescending(p => p.VoteUpCount).Skip(size * (page - 1)).Take(size).Cacheable().ToList();
                     break;
                 default:
-                    posts = temp.ThenByDescending(p => p.ModifyDate).Skip(size * (page - 1)).Take(size).ToList();
+                    posts = temp.ThenByDescending(p => p.ModifyDate).Skip(size * (page - 1)).Take(size).Cacheable().ToList();
                     break;
             }
             ViewBag.Total = temp.Count();
@@ -108,7 +110,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 entry.Description = seminar.Description;
                 entry.Title = seminar.Title;
                 entry.SubTitle = seminar.SubTitle;
-                b = SeminarService.UpdateEntitySaved(entry);
+                b = SeminarService.SaveChanges() > 0;
             }
             return ResultData(null, b, b ? "保存成功" : "保存失败");
         }
@@ -146,7 +148,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Authority]
         public ActionResult GetPageData(int page, int size)
         {
-            var list = SeminarService.LoadPageEntities<int, SeminarOutputDto>(page, size, out int total, s => true, s => s.Id, false).ToList();
+            var list = SeminarService.GetPages<int, SeminarOutputDto>(page, size, out int total, s => true, s => s.Id, false).ToList();
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return PageResult(list, pageCount, total);
         }
@@ -180,7 +182,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 PostId = post.Id,
                 SeminarId = id
             });
-            bool b = SeminarService.UpdateEntitySaved(seminar);
+            bool b = SeminarService.SaveChanges() > 0;
             return ResultData(null, b, b ? $"已成功将【{post.Title}】添加到专题【{seminar.Title}】" : "添加失败!");
         }
 

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

@@ -61,7 +61,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             share.Title = model.Title;
             share.Link = model.Link;
             share.Sort = model.Sort;
-            bool b = FastShareService.UpdateEntitySaved(share);
+            bool b = FastShareService.SaveChanges() > 0;
             return ResultData(null, b, b ? "更新成功" : "更新失败");
         }
     }

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

@@ -70,7 +70,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             var time = DateTime.Today.AddDays(-1);
             string scheme = Request.Scheme;
             var host = Request.Host;
-            var posts = PostService.LoadEntitiesNoTracking(p => p.Status == Status.Pended && p.ModifyDate >= time, p => p.ModifyDate, false).Select(p => new Item()
+            var posts = PostService.GetQueryNoTracking(p => p.Status == Status.Pended && p.ModifyDate >= time, p => p.ModifyDate, false).Select(p => new Item()
             {
                 Author = new Author
                 {
@@ -114,7 +114,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             {
                 return ResultData(null, false, CommonHelper.SystemSettings["DisabledEmailBroadcastTip"]);
             }
-            Broadcast entity = BroadcastService.GetFirstEntity(b => b.Email.Equals(email, StringComparison.InvariantCultureIgnoreCase));
+            Broadcast entity = BroadcastService.Get(b => b.Email.Equals(email, StringComparison.InvariantCultureIgnoreCase));
             var guid = Guid.NewGuid();
             if (entity != null)
             {
@@ -124,7 +124,6 @@ namespace Masuit.MyBlogs.Core.Controllers
                 }
                 entity.ValidateCode = guid.ToString();
                 entity.UpdateTime = DateTime.Now;
-                BroadcastService.UpdateEntity(entity);
             }
             else
             {
@@ -175,7 +174,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpPost]
         public ActionResult Cancel(string email)
         {
-            Broadcast c = BroadcastService.GetFirstEntity(b => b.Email.Equals(email) && b.Status == Status.Subscribed);
+            Broadcast c = BroadcastService.Get(b => b.Email.Equals(email) && b.Status == Status.Subscribed);
             if (c != null)
             {
                 var ts = DateTime.Now.GetTotalMilliseconds();
@@ -214,7 +213,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             {
                 return Content("操作失败,链接已被非法篡改");
             }
-            Broadcast entity = BroadcastService.GetFirstEntity(b => b.Email.Equals(email, StringComparison.InvariantCultureIgnoreCase) && b.ValidateCode.Equals(validate));
+            Broadcast entity = BroadcastService.Get(b => b.Email.Equals(email, StringComparison.InvariantCultureIgnoreCase) && b.ValidateCode.Equals(validate));
             if (entity == null)
             {
                 return Content("该邮箱账户未使用邮件订阅!");
@@ -226,13 +225,11 @@ namespace Masuit.MyBlogs.Core.Controllers
                     entity.Status = Status.Subscribed;
                     entity.ValidateCode = Guid.NewGuid().ToString();
                     entity.UpdateTime = DateTime.Now;
-                    BroadcastService.UpdateEntity(entity);
                     BroadcastService.SaveChanges();
                     return Content("订阅成功!");
                 case "cancel":
                     entity.Status = Status.Canceled;
                     entity.UpdateTime = DateTime.Now;
-                    BroadcastService.UpdateEntity(entity);
                     BroadcastService.SaveChanges();
                     return Content("取消订阅成功,您将不会再接收到文章更新,如果您以后需要再次接收更新推送,可以到主站点重新进行订阅操作!");
                 default: return RedirectToAction("Index", "Home");
@@ -251,7 +248,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ActionResult Save(Broadcast model)
         {
             model.UpdateTime = DateTime.Now;
-            var entry = BroadcastService.GetFirstEntity(c => c.Email.Equals(model.Email));
+            var entry = BroadcastService.Get(c => c.Email.Equals(model.Email));
             bool b;
             if (entry is null)
             {
@@ -262,7 +259,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 entry.Email = model.Email;
                 entry.SubscribeType = model.SubscribeType;
                 entry.UpdateTime = DateTime.Now;
-                b = BroadcastService.UpdateEntitySaved(entry);
+                b = BroadcastService.SaveChanges() > 0;
             }
             return ResultData(model, b, b ? "更新订阅成功!" : "更新订阅失败!");
         }
@@ -291,7 +288,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             Status status = cast.Status;
             cast.UpdateTime = DateTime.Now;
             cast.Status = status == Status.Subscribed ? Status.Subscribing : Status.Subscribed;
-            bool b = BroadcastService.UpdateEntitySaved(cast);
+            bool b = BroadcastService.SaveChanges() > 0;
             return ResultData(null, b, status == Status.Subscribed ? "订阅成功" : "取消订阅成功!");
         }
 
@@ -317,12 +314,13 @@ namespace Masuit.MyBlogs.Core.Controllers
             int total;
             if (string.IsNullOrEmpty(search))
             {
-                list = BroadcastService.LoadPageEntitiesFromL2CacheNoTracking(page, size, out total, b => true, b => b.UpdateTime, false).ToList();
+                list = BroadcastService.GetPagesFromCache(page, size, out total, b => true, b => b.UpdateTime, false).ToList();
             }
             else
             {
-                list = BroadcastService.LoadPageEntitiesFromL2CacheNoTracking(page, size, out total, b => b.Email.Contains(search), b => b.UpdateTime, false).ToList();
+                list = BroadcastService.GetPagesFromCache(page, size, out total, b => b.Email.Contains(search), b => b.UpdateTime, false).ToList();
             }
+
             var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
             return Ok(new PageDataModel(list, pageCount, total));
         }

+ 2 - 3
src/Masuit.MyBlogs.Core/Controllers/SystemController.cs

@@ -142,7 +142,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [AllowAnonymous]
         public ActionResult GetSetting(string name)
         {
-            var entity = SystemSettingService.GetFirstEntity(s => s.Name.Equals(name));
+            var entity = SystemSettingService.Get(s => s.Name.Equals(name));
             return ResultData(entity);
         }
 
@@ -156,7 +156,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             SystemSetting[] settings = JsonConvert.DeserializeObject<List<SystemSetting>>(sets).ToArray();
             foreach (var set in settings)
             {
-                var entry = SystemSettingService.GetFirstEntity(s => s.Name.Equals(set.Name));
+                var entry = SystemSettingService.Get(s => s.Name.Equals(set.Name));
                 if (entry is null)
                 {
                     SystemSettingService.AddEntity(set);
@@ -164,7 +164,6 @@ namespace Masuit.MyBlogs.Core.Controllers
                 else
                 {
                     entry.Value = set.Value;
-                    SystemSettingService.UpdateEntity(entry);
                 }
             }
 

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

@@ -23,7 +23,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 return ResultData(null, false, $"用户名{username}已经存在,请尝试更换其他用户名!");
             }
             userInfo.Username = username;
-            bool b = UserInfoService.UpdateEntitySaved(userInfo);
+            bool b = UserInfoService.SaveChanges() > 0;
             return ResultData(Mapper.Map<UserInfoOutputDto>(userInfo), b, b ? $"用户名修改成功,新用户名为{username}。" : "用户名修改失败!");
         }
 
@@ -37,7 +37,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             UserInfo userInfo = UserInfoService.GetById(id);
             userInfo.NickName = username;
-            bool b = UserInfoService.UpdateEntitySaved(userInfo);
+            bool b = UserInfoService.SaveChanges() > 0;
             return ResultData(Mapper.Map<UserInfoOutputDto>(userInfo), b, b ? $"昵称修改成功,新昵称为{username}。" : "昵称修改失败!");
         }
 
@@ -69,7 +69,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             UserInfo userInfo = UserInfoService.GetById(id);
             userInfo.Avatar = path;
-            bool b = UserInfoService.UpdateEntitySaved(userInfo);
+            bool b = UserInfoService.SaveChanges() > 0;
             return ResultData(Mapper.Map<UserInfoOutputDto>(userInfo), b, b ? $"头像修改成功。" : "头像修改失败!");
         }
     }

+ 6 - 9
src/Masuit.MyBlogs.Core/Extensions/Hangfire/HangfireBackJob.cs

@@ -82,13 +82,13 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
             };
             var u = _userInfoService.GetByUsername(userInfo.Username);
             u.LoginRecord.Add(record);
-            _userInfoService.UpdateEntitySaved(u);
+            _userInfoService.SaveChanges();
             var content = File.ReadAllText(Path.Combine(_hostingEnvironment.WebRootPath, "template", "login.html"))
                 .Replace("{{name}}", u.Username)
                 .Replace("{{time}}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
                 .Replace("{{ip}}", record.IP)
                 .Replace("{{address}}", record.PhysicAddress);
-            CommonHelper.SendMail(_settingService.GetFirstEntity(s => s.Name.Equals("Title")).Value + "账号登录通知", content, _settingService.GetFirstEntity(s => s.Name.Equals("ReceiveEmail")).Value);
+            CommonHelper.SendMail(_settingService.Get(s => s.Name.Equals("Title")).Value + "账号登录通知", content, _settingService.Get(s => s.Name.Equals("ReceiveEmail")).Value);
         }
 
         /// <summary>
@@ -110,7 +110,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                 post.Status = Status.Pended;
                 post.PostDate = DateTime.Now;
                 post.ModifyDate = DateTime.Now;
-                _postService.UpdateEntitySaved(post);
+                _postService.SaveChanges();
             }
         }
 
@@ -128,7 +128,6 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
 
             post.TotalViewCount += 1;
             post.AverageViewCount = post.TotalViewCount / (DateTime.Now - post.PostDate).TotalDays;
-            _postService.UpdateEntity(post);
             _postService.SaveChanges();
         }
 
@@ -170,7 +169,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// </summary>
         public void CheckLinks()
         {
-            var links = _linksService.LoadEntities(l => !l.Except).AsParallel();
+            var links = _linksService.GetQuery(l => !l.Except).AsParallel();
             var client = _httpClientFactory.CreateClient();
             client.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
             client.DefaultRequestHeaders.Referrer = new Uri("https://masuit.com");
@@ -194,8 +193,6 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                     {
                         link.Status = Status.Unavailable;
                     }
-
-                    _linksService.UpdateEntity(link);
                 }).Wait();
             });
             _linksService.SaveChanges();
@@ -208,7 +205,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         public void UpdateLinkWeight(string referer)
         {
             var uri = new Uri(referer);
-            var query = _linksService.LoadEntities(l => l.Url.Contains(uri.Host));
+            var query = _linksService.GetQuery(l => l.Url.Contains(uri.Host));
             if (query.Any())
             {
                 var list = query.ToList();
@@ -240,7 +237,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         public void StatisticsSearchKeywords()
         {
             var start = DateTime.Today.AddMonths(-1);
-            var temp = _searchDetailsService.LoadEntitiesNoTracking(s => s.SearchTime > start, s => s.SearchTime, false).ToList();
+            var temp = _searchDetailsService.GetQueryNoTracking(s => s.SearchTime > start, s => s.SearchTime, false).ToList();
             var month = temp.GroupBy(s => s.KeyWords.ToLower()).OrderByDescending(g => g.Count()).Take(30).Select(g => new
             {
                 Keywords = g.FirstOrDefault().KeyWords,

+ 82 - 150
src/Masuit.MyBlogs.Core/Infrastructure/Repository/BaseRepository.cs

@@ -17,7 +17,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
     /// DAL基类
     /// </summary>
     /// <typeparam name="T">实体类型</typeparam>
-    public class BaseRepository<T> : Disposable, IBaseRepository<T> where T : class, new()
+    public abstract class BaseRepository<T> : Disposable, IBaseRepository<T> where T : class, new()
     {
         public virtual DataContext DataContext { get; set; }
 
@@ -45,20 +45,11 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// 从二级缓存获取所有实体
         /// </summary>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedDbSet<T> GetAllFromL2Cache()
+        public virtual EFCachedDbSet<T> GetAllFromCache()
         {
             return DataContext.Set<T>().Cacheable();
         }
 
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedQueryable<T> GetAllFromL2CacheNoTracking()
-        {
-            return DataContext.Set<T>().AsNoTracking().Cacheable();
-        }
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -74,7 +65,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <typeparam name="TDto">映射实体</typeparam>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> GetAllFromL2Cache<TDto>() where TDto : class
+        public virtual IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class
         {
             return DataContext.Set<T>().AsNoTracking().ProjectTo<TDto>(MapperConfig).Cacheable();
         }
@@ -110,23 +101,11 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> GetAllFromL2Cache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IEnumerable<T> GetAllFromCache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
             return GetAll(orderby, isAsc).Cacheable();
         }
 
-        /// <summary>
-        /// 获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedQueryable<T> GetAllFromL2CacheNoTracking<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return GetAllNoTracking(orderby, isAsc).Cacheable();
-        }
-
         /// <summary>
         /// 获取所有实体
         /// </summary>
@@ -148,7 +127,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> GetAllFromL2Cache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        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).Cacheable();
         }
@@ -158,7 +137,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<T> LoadEntities(Expression<Func<T, bool>> @where)
+        public virtual IQueryable<T> GetQuery(Expression<Func<T, bool>> @where)
         {
             return DataContext.Set<T>().Where(@where);
         }
@@ -171,7 +150,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IOrderedQueryable<T> LoadEntities<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IOrderedQueryable<T> GetQuery<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
             return isAsc ? DataContext.Set<T>().Where(@where).OrderBy(orderby) : DataContext.Set<T>().Where(@where).OrderByDescending(orderby);
         }
@@ -181,7 +160,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> LoadEntitiesFromL2Cache(Expression<Func<T, bool>> @where)
+        public virtual IEnumerable<T> GetQueryFromCache(Expression<Func<T, bool>> @where)
         {
             return DataContext.Set<T>().Where(@where).Cacheable();
         }
@@ -194,9 +173,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> LoadEntitiesFromL2Cache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IEnumerable<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return LoadEntities(where, orderby, isAsc).Cacheable();
+            return GetQuery(where, orderby, isAsc).Cacheable();
         }
 
         /// <summary>
@@ -204,7 +183,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<T> LoadEntitiesNoTracking(Expression<Func<T, bool>> @where)
+        public virtual IQueryable<T> GetQueryNoTracking(Expression<Func<T, bool>> @where)
         {
             return DataContext.Set<T>().Where(@where).AsNoTracking();
         }
@@ -217,7 +196,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IOrderedQueryable<T> LoadEntitiesNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IOrderedQueryable<T> GetQueryNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
             return isAsc ? DataContext.Set<T>().Where(@where).AsNoTracking().OrderBy(orderby) : DataContext.Set<T>().Where(@where).AsNoTracking().OrderByDescending(orderby);
         }
@@ -227,7 +206,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<TDto> LoadEntities<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        public virtual IQueryable<TDto> GetQuery<TDto>(Expression<Func<T, bool>> @where) where TDto : class
         {
             return DataContext.Set<T>().Where(@where).AsNoTracking().ProjectTo<TDto>(MapperConfig);
         }
@@ -241,66 +220,66 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<TDto> LoadEntities<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        public virtual IQueryable<TDto> GetQuery<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
-            return LoadEntitiesNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig);
+            return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig);
         }
 
         /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取(不跟踪实体)
+        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取(不跟踪实体)
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体集合</returns>
-        public virtual IEnumerable<T> LoadEntitiesFromL2CacheNoTracking(Expression<Func<T, bool>> @where)
+        public virtual IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class
         {
-            return DataContext.Set<T>().Where(@where).AsNoTracking().Cacheable();
+            return DataContext.Set<T>().Where(@where).AsNoTracking().ProjectTo<TDto>(MapperConfig).Cacheable();
         }
 
         /// <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 virtual IEnumerable<T> LoadEntitiesFromL2CacheNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IEnumerable<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
-            return LoadEntitiesNoTracking(where, orderby, isAsc).Cacheable();
+            return GetQueryNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable();
         }
 
         /// <summary>
-        /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取(不跟踪实体)
+        /// 获取第一条数据
         /// </summary>
         /// <param name="where">查询条件</param>
-        /// <returns>实体集合</returns>
-        public virtual IEnumerable<TDto> LoadEntitiesFromL2Cache<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        /// <returns>实体</returns>
+        public virtual T Get(Expression<Func<T, bool>> @where)
         {
-            return DataContext.Set<T>().Where(@where).AsNoTracking().ProjectTo<TDto>(MapperConfig).Cacheable();
+            return DataContext.Set<T>().FirstOrDefault(where);
         }
 
         /// <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 virtual IEnumerable<TDto> LoadEntitiesFromL2Cache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        /// <returns>实体</returns>
+        public T GetFromCache(Expression<Func<T, bool>> @where)
         {
-            return LoadEntitiesNoTracking(where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable();
+            return DataContext.Set<T>().Where(where).Cacheable().FirstOrDefault();
         }
 
         /// <summary>
         /// 获取第一条数据
         /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
         /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual T GetFirstEntity(Expression<Func<T, bool>> @where)
+        public virtual T Get<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return DataContext.Set<T>().FirstOrDefault(where);
+            return isAsc ? DataContext.Set<T>().OrderBy(orderby).FirstOrDefault(where) : DataContext.Set<T>().OrderByDescending(orderby).FirstOrDefault(where);
         }
 
         /// <summary>
@@ -311,9 +290,23 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual T GetFirstEntity<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public T GetFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return isAsc ? DataContext.Set<T>().OrderBy(orderby).FirstOrDefault(where) : DataContext.Set<T>().OrderByDescending(orderby).FirstOrDefault(where);
+            return isAsc ? DataContext.Set<T>().OrderBy(orderby).Where(where).Cacheable().FirstOrDefault() : DataContext.Set<T>().OrderByDescending(orderby).Where(where).Cacheable().FirstOrDefault();
+        }
+
+        /// <summary>
+        /// 获取第一条被AutoMapper映射后的数据
+        /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>映射实体</returns>
+        public TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        {
+            return isAsc ? DataContext.Set<T>().Where(where).OrderBy(orderby).ProjectTo<TDto>(MapperConfig).Cacheable().FirstOrDefault() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).ProjectTo<TDto>(MapperConfig).Cacheable().FirstOrDefault(); ;
         }
 
         /// <summary>
@@ -321,7 +314,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetFirstEntityAsync(Expression<Func<T, bool>> @where)
+        public virtual async Task<T> GetAsync(Expression<Func<T, bool>> @where)
         {
             return await DataContext.Set<T>().FirstOrDefaultAsync(where).ConfigureAwait(true);
         }
@@ -334,7 +327,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetFirstEntityAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual async Task<T> GetAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
             return isAsc ? await DataContext.Set<T>().OrderBy(orderby).FirstOrDefaultAsync(where).ConfigureAwait(true) : await DataContext.Set<T>().OrderByDescending(orderby).FirstOrDefaultAsync(where).ConfigureAwait(true);
         }
@@ -344,7 +337,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual T GetFirstEntityNoTracking(Expression<Func<T, bool>> @where)
+        public virtual T GetNoTracking(Expression<Func<T, bool>> @where)
         {
             return DataContext.Set<T>().AsNoTracking().FirstOrDefault(where);
         }
@@ -357,7 +350,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual T GetFirstEntityNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual T GetNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
             return isAsc ? DataContext.Set<T>().OrderBy(orderby).AsNoTracking().FirstOrDefault(where) : DataContext.Set<T>().OrderByDescending(orderby).AsNoTracking().FirstOrDefault(where);
         }
@@ -367,11 +360,21 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual TDto GetFirstEntity<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        public virtual TDto Get<TDto>(Expression<Func<T, bool>> @where) where TDto : class
         {
             return DataContext.Set<T>().Where(where).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefault();
         }
 
+        /// <summary>
+        /// 获取第一条被AutoMapper映射后的数据
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>实体</returns>
+        public TDto GetFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        {
+            return DataContext.Set<T>().Where(where).ProjectTo<TDto>(MapperConfig).Cacheable().FirstOrDefault();
+        }
+
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据(不跟踪实体)
         /// </summary>
@@ -381,7 +384,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual TDto GetFirstEntity<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        public virtual TDto Get<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).FirstOrDefault() : DataContext.Set<T>().Where(where).OrderByDescending(orderby).AsNoTracking().ProjectTo<TDto>(MapperConfig).FirstOrDefault();
         }
@@ -391,7 +394,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetFirstEntityNoTrackingAsync(Expression<Func<T, bool>> @where)
+        public virtual async Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> @where)
         {
             return await DataContext.Set<T>().AsNoTracking().FirstOrDefaultAsync(where).ConfigureAwait(true);
         }
@@ -404,7 +407,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetFirstEntityNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual async Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
             return isAsc ? await DataContext.Set<T>().OrderBy(orderby).AsNoTracking().FirstOrDefaultAsync(where).ConfigureAwait(true) : await DataContext.Set<T>().OrderByDescending(orderby).AsNoTracking().FirstOrDefaultAsync(where).ConfigureAwait(true);
         }
@@ -440,7 +443,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<T> LoadPageEntities<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc)
+        public virtual IQueryable<T> GetPages<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc)
         {
             var temp = DataContext.Set<T>().Where(where);
             totalCount = temp.Count();
@@ -468,9 +471,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedQueryable<T> LoadPageEntitiesFromL2Cache<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc)
+        public virtual EFCachedQueryable<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc)
         {
-            return LoadPageEntities(pageIndex, pageSize, out totalCount, where, orderby, isAsc).Cacheable();
+            return GetPages(pageIndex, pageSize, out totalCount, where, orderby, isAsc).Cacheable();
         }
 
         /// <summary>
@@ -484,7 +487,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<T> LoadPageEntitiesNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IQueryable<T> GetPagesNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
             var temp = DataContext.Set<T>().Where(where).AsNoTracking();
             totalCount = temp.Count();
@@ -513,25 +516,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<TDto> LoadPageEntities<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
-        {
-            return LoadPageEntitiesNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc).ProjectTo<TDto>(MapperConfig);
-        }
-
-        /// <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>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> LoadPageEntitiesFromL2CacheNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IQueryable<TDto> GetPages<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
-            return LoadPageEntitiesNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc).Cacheable();
+            return GetPagesNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc).ProjectTo<TDto>(MapperConfig);
         }
 
         /// <summary>
@@ -546,9 +533,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedQueryable<TDto> LoadPageEntitiesFromL2Cache<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        public virtual EFCachedQueryable<TDto> GetPagesFromCache<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
-            return LoadPageEntitiesNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable();
+            return GetPagesNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc).ProjectTo<TDto>(MapperConfig).Cacheable();
         }
 
         /// <summary>
@@ -602,51 +589,12 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return await DataContext.Set<T>().Where(@where).DeleteAsync().ConfigureAwait(true);
         }
 
-        /// <summary>
-        /// 更新实体
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public virtual bool UpdateEntity(T t)
-        {
-            DataContext.Entry(t).State = EntityState.Modified;
-            DataContext.Update(t);
-            return true;
-        }
-
-        /// <summary>
-        /// 根据条件更新实体
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public virtual int UpdateEntity(Expression<Func<T, bool>> @where, T t)
-        {
-            return DataContext.Set<T>().Where(@where).Update(ts => t);
-        }
-
-        /// <summary>
-        /// 根据条件更新实体(异步)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public virtual async Task<int> UpdateEntityAsync(Expression<Func<T, bool>> @where, T t)
-        {
-            return await DataContext.Set<T>().Where(@where).UpdateAsync(ts => t).ConfigureAwait(true);
-        }
-
         /// <summary>
         /// 添加实体
         /// </summary>
         /// <param name="t">需要添加的实体</param>
         /// <returns>添加成功</returns>
-        public virtual T AddEntity(T t)
-        {
-            DataContext.Entry(t).State = EntityState.Added;
-            DataContext.Add(t);
-            return t;
-        }
+        public abstract T AddEntity(T t);
 
         /// <summary>
         /// 批量添加实体
@@ -719,20 +667,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return true;
         }
 
-        /// <summary>
-        /// 更新多个实体
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        public virtual bool UpdateEntities(IEnumerable<T> list)
-        {
-            list.ForEach(t =>
-            {
-                UpdateEntity(t);
-            });
-            return true;
-        }
-
         /// <summary>
         /// 添加多个实体
         /// </summary>
@@ -740,12 +674,10 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
         /// <returns>添加成功</returns>
         public virtual IEnumerable<T> AddEntities(IList<T> list)
         {
-            //foreach (T t in list)
-            //{
-            //    yield return AddEntity(t);
-            //}
-            DataContext.BulkInsert(list);
-            return list;
+            foreach (T t in list)
+            {
+                yield return AddEntity(t);
+            }
         }
 
         public override void Dispose(bool disposing)

+ 56 - 96
src/Masuit.MyBlogs.Core/Infrastructure/Repository/Interface/IBaseRepository.cs

@@ -26,13 +26,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// 从二级缓存获取所有实体
         /// </summary>
         /// <returns>还未执行的SQL语句</returns>
-        EFCachedDbSet<T> GetAllFromL2Cache();
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns>还未执行的SQL语句</returns>
-        EFCachedQueryable<T> GetAllFromL2CacheNoTracking();
+        EFCachedDbSet<T> GetAllFromCache();
 
         /// <summary>
         /// 获取所有实体
@@ -46,7 +40,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// </summary>
         /// <typeparam name="TDto">映射实体</typeparam>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<TDto> GetAllFromL2Cache<TDto>() where TDto : class;
+        IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class;
 
         /// <summary>
         /// 获取所有实体
@@ -73,16 +67,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> GetAllFromL2Cache<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>
-        EFCachedQueryable<T> GetAllFromL2CacheNoTracking<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IEnumerable<T> GetAllFromCache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取所有实体
@@ -102,14 +87,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<TDto> GetAllFromL2Cache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        IEnumerable<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<T> LoadEntities(Expression<Func<T, bool>> @where);
+        IQueryable<T> GetQuery(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 基本查询方法,获取一个集合
@@ -119,14 +104,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IOrderedQueryable<T> LoadEntities<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IOrderedQueryable<T> GetQuery<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<TDto> LoadEntities<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+        IQueryable<TDto> GetQuery<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合
@@ -138,14 +123,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
         /// <returns></returns>
-        IQueryable<TDto> LoadEntities<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        IQueryable<TDto> GetQuery<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> LoadEntitiesFromL2Cache(Expression<Func<T, bool>> @where);
+        IEnumerable<T> GetQueryFromCache(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
@@ -155,14 +140,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> LoadEntitiesFromL2Cache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IEnumerable<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<TDto> LoadEntitiesFromL2Cache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+        IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
@@ -173,14 +158,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<TDto> LoadEntitiesFromL2Cache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        IEnumerable<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<T> LoadEntitiesNoTracking(Expression<Func<T, bool>> @where);
+        IQueryable<T> GetQueryNoTracking(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
@@ -190,31 +175,31 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IOrderedQueryable<T> LoadEntitiesNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IOrderedQueryable<T> GetQueryNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取(不跟踪实体)
+        /// 获取第一条数据
         /// </summary>
         /// <param name="where">查询条件</param>
-        /// <returns>实体集合</returns>
-        IEnumerable<T> LoadEntitiesFromL2CacheNoTracking(Expression<Func<T, bool>> @where);
+        /// <returns>实体</returns>
+        T Get(Expression<Func<T, bool>> @where);
 
         /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取(不跟踪实体)
+        /// 获取第一条数据
         /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
         /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> LoadEntitiesFromL2CacheNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        /// <returns>实体</returns>
+        T GetFromCache(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 获取第一条数据
         /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
         /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        T GetFirstEntity(Expression<Func<T, bool>> @where);
+        T Get<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取第一条数据
@@ -224,14 +209,32 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        T GetFirstEntity<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        T GetFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+
+        /// <summary>
+        /// 获取第一条被AutoMapper映射后的数据
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>实体</returns>
+        TDto Get<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        TDto GetFirstEntity<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+        TDto GetFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+
+        /// <summary>
+        /// 获取第一条被AutoMapper映射后的数据
+        /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>映射实体</returns>
+        TDto Get<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
@@ -242,14 +245,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>映射实体</returns>
-        TDto GetFirstEntity<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 获取第一条数据
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        Task<T> GetFirstEntityAsync(Expression<Func<T, bool>> @where);
+        Task<T> GetAsync(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 获取第一条数据
@@ -259,14 +262,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        Task<T> GetFirstEntityAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        Task<T> GetAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取第一条数据(不跟踪实体)
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        T GetFirstEntityNoTracking(Expression<Func<T, bool>> @where);
+        T GetNoTracking(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 获取第一条数据(不跟踪实体)
@@ -276,14 +279,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        T GetFirstEntityNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        T GetNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取第一条数据(异步,不跟踪实体)
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        Task<T> GetFirstEntityNoTrackingAsync(Expression<Func<T, bool>> @where);
+        Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 获取第一条数据(异步,不跟踪实体)
@@ -293,7 +296,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        Task<T> GetFirstEntityNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 根据ID找实体
@@ -320,7 +323,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<T> LoadPageEntities<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc);
+        IQueryable<T> GetPages<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc);
 
         /// <summary>
         /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
@@ -334,7 +337,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<TDto> LoadPageEntities<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class;
+        IQueryable<TDto> GetPages<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class;
 
         /// <summary>
         /// 高效分页查询方法,优先从二级缓存读取
@@ -347,7 +350,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        EFCachedQueryable<T> LoadPageEntitiesFromL2Cache<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc);
+        EFCachedQueryable<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc);
 
         /// <summary>
         /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
@@ -361,7 +364,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        EFCachedQueryable<TDto> LoadPageEntitiesFromL2Cache<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class;
+        EFCachedQueryable<TDto> GetPagesFromCache<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class;
 
         /// <summary>
         /// 高效分页查询方法(不跟踪实体)
@@ -374,20 +377,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<T> LoadPageEntitiesNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <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>
-        /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> LoadPageEntitiesFromL2CacheNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IQueryable<T> GetPagesNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 根据ID删除实体
@@ -417,29 +407,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>删除成功</returns>
         Task<int> DeleteEntityAsync(Expression<Func<T, bool>> @where);
 
-        /// <summary>
-        /// 更新实体
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        bool UpdateEntity(T t);
-
-        /// <summary>
-        /// 根据条件更新实体
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        int UpdateEntity(Expression<Func<T, bool>> @where, T t);
-
-        /// <summary>
-        /// 根据条件更新实体(异步)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        Task<int> UpdateEntityAsync(Expression<Func<T, bool>> @where, T t);
-
         /// <summary>
         /// 添加实体
         /// </summary>
@@ -493,13 +460,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
         /// <returns>删除成功</returns>
         bool DeleteEntities(IEnumerable<T> list);
 
-        /// <summary>
-        /// 更新多个实体
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        bool UpdateEntities(IEnumerable<T> list);
-
         /// <summary>
         /// 添加多个实体
         /// </summary>

+ 10 - 0
src/Masuit.MyBlogs.Core/Infrastructure/Repository/PostRepository.cs

@@ -5,5 +5,15 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
 {
     public partial class PostRepository : BaseRepository<Post>, IPostRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Post AddEntity(Post t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 }

+ 210 - 0
src/Masuit.MyBlogs.Core/Infrastructure/Repository/Repositories.cs

@@ -5,84 +5,294 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
 {
     public partial class BroadcastRepository : BaseRepository<Broadcast>, IBroadcastRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Broadcast AddEntity(Broadcast t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class CategoryRepository : BaseRepository<Category>, ICategoryRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Category AddEntity(Category t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class CommentRepository : BaseRepository<Comment>, ICommentRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Comment AddEntity(Comment t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class DonateRepository : BaseRepository<Donate>, IDonateRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Donate AddEntity(Donate t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class FastShareRepository : BaseRepository<FastShare>, IFastShareRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override FastShare AddEntity(FastShare t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class InternalMessageRepository : BaseRepository<InternalMessage>, IInternalMessageRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override InternalMessage AddEntity(InternalMessage t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class LeaveMessageRepository : BaseRepository<LeaveMessage>, ILeaveMessageRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override LeaveMessage AddEntity(LeaveMessage t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class LinksRepository : BaseRepository<Links>, ILinksRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Links AddEntity(Links t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class LoginRecordRepository : BaseRepository<LoginRecord>, ILoginRecordRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override LoginRecord AddEntity(LoginRecord t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class MenuRepository : BaseRepository<Menu>, IMenuRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Menu AddEntity(Menu t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class MiscRepository : BaseRepository<Misc>, IMiscRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Misc AddEntity(Misc t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class NoticeRepository : BaseRepository<Notice>, INoticeRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Notice AddEntity(Notice t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class PostHistoryVersionRepository : BaseRepository<PostHistoryVersion>, IPostHistoryVersionRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override PostHistoryVersion AddEntity(PostHistoryVersion t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class SearchDetailsRepository : BaseRepository<SearchDetails>, ISearchDetailsRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override SearchDetails AddEntity(SearchDetails t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class SeminarRepository : BaseRepository<Seminar>, ISeminarRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Seminar AddEntity(Seminar t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class SystemSettingRepository : BaseRepository<SystemSetting>, ISystemSettingRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override SystemSetting AddEntity(SystemSetting t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class UserInfoRepository : BaseRepository<UserInfo>, IUserInfoRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override UserInfo AddEntity(UserInfo t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class SeminarPostRepository : BaseRepository<SeminarPost>, ISeminarPostRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override SeminarPost AddEntity(SeminarPost t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class SeminarPostHistoryVersionRepository : BaseRepository<SeminarPostHistoryVersion>, ISeminarPostHistoryVersionRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override SeminarPostHistoryVersion AddEntity(SeminarPostHistoryVersion t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 
     public partial class BannerRepository : BaseRepository<Banner>, IBannerRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Banner AddEntity(Banner t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
     public partial class PostMergeRequestRepository : BaseRepository<PostMergeRequest>, IPostMergeRequestRepository
     {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override PostMergeRequest AddEntity(PostMergeRequest t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
     }
 }

+ 93 - 192
src/Masuit.MyBlogs.Core/Infrastructure/Services/BaseService.cs

@@ -49,18 +49,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// 从二级缓存获取所有实体
         /// </summary>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedDbSet<T> GetAllFromL2Cache()
+        public virtual EFCachedDbSet<T> GetAllFromCache()
         {
-            return BaseDal.GetAllFromL2Cache();
-        }
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedQueryable<T> GetAllFromL2CacheNoTracking()
-        {
-            return BaseDal.GetAllFromL2CacheNoTracking();
+            return BaseDal.GetAllFromCache();
         }
 
         /// <summary>
@@ -78,9 +69,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <typeparam name="TDto">映射实体</typeparam>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> GetAllFromL2Cache<TDto>() where TDto : class
+        public virtual IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class
         {
-            return BaseDal.GetAllFromL2Cache<TDto>();
+            return BaseDal.GetAllFromCache<TDto>();
         }
 
         /// <summary>
@@ -114,21 +105,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> GetAllFromL2Cache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.GetAllFromL2Cache(orderby, isAsc);
-        }
-
-        /// <summary>
-        /// 获取所有实体
-        /// </summary>
-        /// <typeparam name="TS">排序</typeparam>
-        /// <param name="orderby">排序字段</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedQueryable<T> GetAllFromL2CacheNoTracking<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IEnumerable<T> GetAllFromCache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return BaseDal.GetAllFromL2CacheNoTracking(orderby, isAsc);
+            return BaseDal.GetAllFromCache(orderby, isAsc);
         }
 
         /// <summary>
@@ -152,9 +131,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> GetAllFromL2Cache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        public virtual IEnumerable<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
-            return BaseDal.GetAllFromL2Cache<TS, TDto>(orderby, isAsc);
+            return BaseDal.GetAllFromCache<TS, TDto>(orderby, isAsc);
         }
 
         /// <summary>
@@ -162,9 +141,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<T> LoadEntities(Expression<Func<T, bool>> @where)
+        public virtual IQueryable<T> GetQuery(Expression<Func<T, bool>> @where)
         {
-            return BaseDal.LoadEntities(where);
+            return BaseDal.GetQuery(where);
         }
 
         /// <summary>
@@ -175,9 +154,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IOrderedQueryable<T> IBaseService<T>.LoadEntities<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc)
+        IOrderedQueryable<T> IBaseService<T>.GetQuery<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc)
         {
-            return BaseDal.LoadEntities(where, orderby, isAsc);
+            return BaseDal.GetQuery(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -185,9 +164,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<TDto> LoadEntities<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        public virtual IQueryable<TDto> GetQuery<TDto>(Expression<Func<T, bool>> @where) where TDto : class
         {
-            return BaseDal.LoadEntities<TDto>(where);
+            return BaseDal.GetQuery<TDto>(where);
         }
 
         /// <summary>
@@ -200,9 +179,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
         /// <returns></returns>
-        public virtual IQueryable<TDto> LoadEntities<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        public virtual IQueryable<TDto> GetQuery<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
-            return BaseDal.LoadEntities<TS, TDto>(where, orderby, isAsc);
+            return BaseDal.GetQuery<TS, TDto>(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -210,9 +189,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> LoadEntitiesFromL2Cache(Expression<Func<T, bool>> @where)
+        public virtual IEnumerable<T> GetQueryFromCache(Expression<Func<T, bool>> @where)
         {
-            return BaseDal.LoadEntitiesFromL2Cache(where);
+            return BaseDal.GetQueryFromCache(where);
         }
 
         /// <summary>
@@ -223,9 +202,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> LoadEntitiesFromL2Cache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IEnumerable<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return BaseDal.LoadEntitiesFromL2Cache(where, orderby, isAsc);
+            return BaseDal.GetQueryFromCache(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -233,9 +212,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> LoadEntitiesFromL2Cache<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        public virtual IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class
         {
-            return BaseDal.LoadEntitiesFromL2Cache<TDto>(where);
+            return BaseDal.GetQueryFromCache<TDto>(where);
         }
 
         /// <summary>
@@ -247,9 +226,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<TDto> LoadEntitiesFromL2Cache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        public virtual IEnumerable<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
-            return BaseDal.LoadEntitiesFromL2Cache<TS, TDto>(where, orderby, isAsc);
+            return BaseDal.GetQueryFromCache<TS, TDto>(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -257,9 +236,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<T> LoadEntitiesNoTracking(Expression<Func<T, bool>> @where)
+        public virtual IQueryable<T> GetQueryNoTracking(Expression<Func<T, bool>> @where)
         {
-            return BaseDal.LoadEntitiesNoTracking(where);
+            return BaseDal.GetQueryNoTracking(where);
         }
 
         /// <summary>
@@ -270,42 +249,42 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IOrderedQueryable<T> LoadEntitiesNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IOrderedQueryable<T> GetQueryNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return BaseDal.LoadEntitiesNoTracking(where, orderby, isAsc);
+            return BaseDal.GetQueryNoTracking(where, orderby, isAsc);
         }
 
         /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取(不跟踪实体)
+        /// 获取第一条数据
         /// </summary>
         /// <param name="where">查询条件</param>
-        /// <returns>实体集合</returns>
-        public virtual IEnumerable<T> LoadEntitiesFromL2CacheNoTracking(Expression<Func<T, bool>> @where)
+        /// <returns>实体</returns>
+        public virtual T Get(Expression<Func<T, bool>> @where)
         {
-            return BaseDal.LoadEntitiesFromL2CacheNoTracking(where);
+            return BaseDal.Get(where);
         }
 
         /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取(不跟踪实体)
+        /// 获取第一条数据
         /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
         /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> LoadEntitiesFromL2CacheNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        /// <returns>实体</returns>
+        public T GetFromCache(Expression<Func<T, bool>> @where)
         {
-            return BaseDal.LoadEntitiesFromL2CacheNoTracking(where, orderby, isAsc);
+            return BaseDal.GetFromCache(where);
         }
 
         /// <summary>
         /// 获取第一条数据
         /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
         /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual T GetFirstEntity(Expression<Func<T, bool>> @where)
+        public virtual T Get<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return BaseDal.GetFirstEntity(where);
+            return BaseDal.Get(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -316,9 +295,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual T GetFirstEntity<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public T GetFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return BaseDal.GetFirstEntity(where, orderby, isAsc);
+            return BaseDal.GetFromCache(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -326,9 +305,19 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual TDto GetFirstEntity<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        public virtual TDto Get<TDto>(Expression<Func<T, bool>> @where) where TDto : class
         {
-            return BaseDal.GetFirstEntity<TDto>(where);
+            return BaseDal.Get<TDto>(where);
+        }
+
+        /// <summary>
+        /// 获取第一条被AutoMapper映射后的数据
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>实体</returns>
+        public TDto GetFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class
+        {
+            return BaseDal.GetFromCache<TDto>(where);
         }
 
         /// <summary>
@@ -340,9 +329,23 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>映射实体</returns>
-        public virtual TDto GetFirstEntity<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        public virtual TDto Get<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
         {
-            return BaseDal.GetFirstEntity<TS, TDto>(where, orderby, isAsc);
+            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 TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class
+        {
+            return BaseDal.GetFromCache<TS, TDto>(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -353,9 +356,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetFirstEntityAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual async Task<T> GetAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return await BaseDal.GetFirstEntityAsync(where, orderby, isAsc);
+            return await BaseDal.GetAsync(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -363,9 +366,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetFirstEntityAsync(Expression<Func<T, bool>> @where)
+        public virtual async Task<T> GetAsync(Expression<Func<T, bool>> @where)
         {
-            return await BaseDal.GetFirstEntityAsync(where);
+            return await BaseDal.GetAsync(where);
         }
 
         /// <summary>
@@ -373,9 +376,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual T GetFirstEntityNoTracking(Expression<Func<T, bool>> @where)
+        public virtual T GetNoTracking(Expression<Func<T, bool>> @where)
         {
-            return BaseDal.GetFirstEntityNoTracking(where);
+            return BaseDal.GetNoTracking(where);
         }
 
         /// <summary>
@@ -386,9 +389,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual T GetFirstEntityNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual T GetNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return BaseDal.GetFirstEntityNoTracking(where, orderby, isAsc);
+            return BaseDal.GetNoTracking(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -396,9 +399,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetFirstEntityNoTrackingAsync(Expression<Func<T, bool>> @where)
+        public virtual async Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> @where)
         {
-            return await BaseDal.GetFirstEntityNoTrackingAsync(where);
+            return await BaseDal.GetNoTrackingAsync(where);
         }
 
         /// <summary>
@@ -409,9 +412,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        public virtual async Task<T> GetFirstEntityNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual async Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return await BaseDal.GetFirstEntityNoTrackingAsync(where, orderby, isAsc);
+            return await BaseDal.GetNoTrackingAsync(where, orderby, isAsc);
         }
 
         /// <summary>
@@ -445,9 +448,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<T> LoadPageEntities<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
+        public virtual IQueryable<T> GetPages<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc = true)
         {
-            return BaseDal.LoadPageEntities(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
+            return BaseDal.GetPages(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
         }
 
         /// <summary>
@@ -462,9 +465,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<TDto> LoadPageEntities<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class
+        public virtual IQueryable<TDto> GetPages<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class
         {
-            return BaseDal.LoadPageEntities<TS, TDto>(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
+            return BaseDal.GetPages<TS, TDto>(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
         }
 
         /// <summary>
@@ -478,9 +481,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedQueryable<T> LoadPageEntitiesFromL2Cache<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual EFCachedQueryable<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return BaseDal.LoadPageEntitiesFromL2Cache(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
+            return BaseDal.GetPagesFromCache(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
         }
 
         /// <summary>
@@ -495,9 +498,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual EFCachedQueryable<TDto> LoadPageEntitiesFromL2Cache<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class
+        public virtual EFCachedQueryable<TDto> GetPagesFromCache<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class
         {
-            return BaseDal.LoadPageEntitiesFromL2Cache<TS, TDto>(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
+            return BaseDal.GetPagesFromCache<TS, TDto>(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
         }
 
         /// <summary>
@@ -511,25 +514,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        public virtual IQueryable<T> LoadPageEntitiesNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
-        {
-            return BaseDal.LoadPageEntitiesNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
-        }
-
-        /// <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>
-        /// <returns>还未执行的SQL语句</returns>
-        public virtual IEnumerable<T> LoadPageEntitiesFromL2CacheNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
+        public virtual IQueryable<T> GetPagesNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true)
         {
-            return BaseDal.LoadPageEntitiesFromL2CacheNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
+            return BaseDal.GetPagesNoTracking(pageIndex, pageSize, out totalCount, where, orderby, isAsc);
         }
 
         /// <summary>
@@ -638,60 +625,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return await SaveChangesAsync();
         }
 
-        /// <summary>
-        /// 更新实体
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public virtual bool UpdateEntity(T t)
-        {
-            return BaseDal.UpdateEntity(t);
-        }
-
-        /// <summary>
-        /// 更新实体并保存
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public virtual bool UpdateEntitySaved(T t)
-        {
-            BaseDal.UpdateEntity(t);
-            return SaveChanges() > 0;
-        }
-
-        /// <summary>
-        /// 更新实体并保存(异步)
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public virtual async Task<int> UpdateEntitySavedAsync(T t)
-        {
-            BaseDal.UpdateEntity(t);
-            return await SaveChangesAsync();
-        }
-
-        /// <summary>
-        /// 根据条件更新实体
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public virtual int UpdateEntity(Expression<Func<T, bool>> @where, T t)
-        {
-            return BaseDal.UpdateEntity(where, t);
-        }
-
-        /// <summary>
-        /// 根据条件更新实体(异步)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public virtual async Task<int> UpdateEntityAsync(Expression<Func<T, bool>> @where, T t)
-        {
-            return await BaseDal.UpdateEntityAsync(where, t);
-        }
-
         /// <summary>
         /// 添加实体
         /// </summary>
@@ -795,38 +728,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             return await SaveChangesAsync();
         }
 
-        /// <summary>
-        /// 更新多个实体
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        public virtual bool UpdateEntities(IEnumerable<T> list)
-        {
-            return BaseDal.UpdateEntities(list);
-        }
-
-        /// <summary>
-        /// 更新多个实体并保存
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        public virtual bool UpdateEntitiesSaved(IEnumerable<T> list)
-        {
-            BaseDal.UpdateEntities(list);
-            return SaveChanges() > 0;
-        }
-
-        /// <summary>
-        /// 更新多个实体并保存(异步)
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        public virtual async Task<int> UpdateEntitiesSavedAsync(IEnumerable<T> list)
-        {
-            BaseDal.UpdateEntities(list);
-            return await SaveChangesAsync();
-        }
-
         /// <summary>
         /// 添加多个实体并保存
         /// </summary>

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

@@ -26,7 +26,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             {
                 moveCat.PostHistoryVersion.Add(p);
             });
-            UpdateEntity(moveCat);
+
             bool b = DeleteByIdSaved(id);
             return b;
         }

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

@@ -34,7 +34,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         private void GetSelfAndAllChildrenCommentsByParentId(Comment comment, List<Comment> list)
         {
-            var comments = LoadEntitiesFromL2CacheNoTracking(x => x.ParentId == comment.Id).ToList();
+            var comments = GetQueryFromCache(x => x.ParentId == comment.Id).ToList();
             if (comments.Any())
             {
                 list.AddRange(comments);
@@ -67,7 +67,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         private int GetParentCommentIdByChildId(Comment com)
         {
-            Comment comment = GetFirstEntityNoTracking(c => c.Id == com.ParentId);
+            Comment comment = GetNoTracking(c => c.Id == com.ParentId);
             if (comment != null)
             {
                 return GetParentCommentIdByChildId(comment);

+ 56 - 124
src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/IBaseService.cs

@@ -25,13 +25,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// 从二级缓存获取所有实体
         /// </summary>
         /// <returns>还未执行的SQL语句</returns>
-        EFCachedDbSet<T> GetAllFromL2Cache();
-
-        /// <summary>
-        /// 从二级缓存获取所有实体
-        /// </summary>
-        /// <returns>还未执行的SQL语句</returns>
-        EFCachedQueryable<T> GetAllFromL2CacheNoTracking();
+        EFCachedDbSet<T> GetAllFromCache();
 
         /// <summary>
         /// 获取所有实体
@@ -45,7 +39,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// </summary>
         /// <typeparam name="TDto">映射实体</typeparam>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<TDto> GetAllFromL2Cache<TDto>() where TDto : class;
+        IEnumerable<TDto> GetAllFromCache<TDto>() where TDto : class;
 
         /// <summary>
         /// 获取所有实体
@@ -72,16 +66,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> GetAllFromL2Cache<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>
-        EFCachedQueryable<T> GetAllFromL2CacheNoTracking<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IEnumerable<T> GetAllFromCache<TS>(Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取所有实体
@@ -101,14 +86,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<TDto> GetAllFromL2Cache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        IEnumerable<TDto> GetAllFromCache<TS, TDto>(Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<T> LoadEntities(Expression<Func<T, bool>> @where);
+        IQueryable<T> GetQuery(Expression<Func<T, bool>> @where);
         /// <summary>
         /// 基本查询方法,获取一个集合
         /// </summary>
@@ -117,14 +102,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IOrderedQueryable<T> LoadEntities<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IOrderedQueryable<T> GetQuery<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<TDto> LoadEntities<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+        IQueryable<TDto> GetQuery<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合
@@ -136,14 +121,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
         /// <returns></returns>
-        IQueryable<TDto> LoadEntities<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        IQueryable<TDto> GetQuery<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> LoadEntitiesFromL2Cache(Expression<Func<T, bool>> @where);
+        IEnumerable<T> GetQueryFromCache(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 基本查询方法,获取一个集合,优先从二级缓存读取
@@ -153,14 +138,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> LoadEntitiesFromL2Cache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IEnumerable<T> GetQueryFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<TDto> LoadEntitiesFromL2Cache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+        IEnumerable<TDto> GetQueryFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取
@@ -171,14 +156,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<TDto> LoadEntitiesFromL2Cache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        IEnumerable<TDto> GetQueryFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<T> LoadEntitiesNoTracking(Expression<Func<T, bool>> @where);
+        IQueryable<T> GetQueryNoTracking(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 基本查询方法,获取一个集合(不跟踪实体)
@@ -188,31 +173,31 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序方式</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IOrderedQueryable<T> LoadEntitiesNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IOrderedQueryable<T> GetQueryNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取(不跟踪实体)
+        /// 获取第一条数据
         /// </summary>
         /// <param name="where">查询条件</param>
-        /// <returns>实体集合</returns>
-        IEnumerable<T> LoadEntitiesFromL2CacheNoTracking(Expression<Func<T, bool>> @where);
+        /// <returns>实体</returns>
+        T Get(Expression<Func<T, bool>> @where);
 
         /// <summary>
-        /// 基本查询方法,获取一个集合,优先从二级缓存读取(不跟踪实体)
+        /// 获取第一条数据
         /// </summary>
-        /// <typeparam name="TS">排序字段</typeparam>
         /// <param name="where">查询条件</param>
-        /// <param name="orderby">排序方式</param>
-        /// <param name="isAsc">是否升序</param>
-        /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> LoadEntitiesFromL2CacheNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        /// <returns>实体</returns>
+        T GetFromCache(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 获取第一条数据
         /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
         /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        T GetFirstEntity(Expression<Func<T, bool>> @where);
+        T Get<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取第一条数据
@@ -222,14 +207,32 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        T GetFirstEntity<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        T GetFromCache<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+
+        /// <summary>
+        /// 获取第一条被AutoMapper映射后的数据
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>实体</returns>
+        TDto Get<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
 
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        TDto GetFirstEntity<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+        TDto GetFromCache<TDto>(Expression<Func<T, bool>> @where) where TDto : class;
+
+        /// <summary>
+        /// 获取第一条被AutoMapper映射后的数据
+        /// </summary>
+        /// <typeparam name="TS">排序</typeparam>
+        /// <typeparam name="TDto">映射实体</typeparam>
+        /// <param name="where">查询条件</param>
+        /// <param name="orderby">排序字段</param>
+        /// <param name="isAsc">是否升序</param>
+        /// <returns>映射实体</returns>
+        TDto Get<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 获取第一条被AutoMapper映射后的数据
@@ -240,14 +243,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>映射实体</returns>
-        TDto GetFirstEntity<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
+        TDto GetFromCache<TS, TDto>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true) where TDto : class;
 
         /// <summary>
         /// 获取第一条数据
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        Task<T> GetFirstEntityAsync(Expression<Func<T, bool>> @where);
+        Task<T> GetAsync(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 获取第一条数据
@@ -257,14 +260,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        Task<T> GetFirstEntityAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        Task<T> GetAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取第一条数据(不跟踪实体)
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        T GetFirstEntityNoTracking(Expression<Func<T, bool>> @where);
+        T GetNoTracking(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 获取第一条数据(不跟踪实体)
@@ -274,14 +277,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        T GetFirstEntityNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        T GetNoTracking<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 获取第一条数据(异步,不跟踪实体)
         /// </summary>
         /// <param name="where">查询条件</param>
         /// <returns>实体</returns>
-        Task<T> GetFirstEntityNoTrackingAsync(Expression<Func<T, bool>> @where);
+        Task<T> GetNoTrackingAsync(Expression<Func<T, bool>> @where);
 
         /// <summary>
         /// 获取第一条数据(异步,不跟踪实体)
@@ -291,7 +294,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">排序字段</param>
         /// <param name="isAsc">是否升序</param>
         /// <returns>实体</returns>
-        Task<T> GetFirstEntityNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        Task<T> GetNoTrackingAsync<TS>(Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 根据ID找实体
@@ -318,7 +321,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<T> LoadPageEntities<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc);
+        IQueryable<T> GetPages<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc);
 
         /// <summary>
         /// 高效分页查询方法,取出被AutoMapper映射后的数据集合
@@ -332,7 +335,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<TDto> LoadPageEntities<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class;
+        IQueryable<TDto> GetPages<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, TS>> orderby, bool isAsc) where TDto : class;
 
         /// <summary>
         /// 高效分页查询方法,优先从二级缓存读取
@@ -345,7 +348,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        EFCachedQueryable<T> LoadPageEntitiesFromL2Cache<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc);
+        EFCachedQueryable<T> GetPagesFromCache<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc);
 
         /// <summary>
         /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合
@@ -359,7 +362,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        EFCachedQueryable<TDto> LoadPageEntitiesFromL2Cache<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class;
+        EFCachedQueryable<TDto> GetPagesFromCache<TS, TDto>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc) where TDto : class;
 
         /// <summary>
         /// 高效分页查询方法(不跟踪实体)
@@ -372,20 +375,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <param name="orderby">orderby Lambda条件表达式</param>
         /// <param name="isAsc">升序降序</param>
         /// <returns>还未执行的SQL语句</returns>
-        IQueryable<T> LoadPageEntitiesNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
-
-        /// <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>
-        /// <returns>还未执行的SQL语句</returns>
-        IEnumerable<T> LoadPageEntitiesFromL2CacheNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
+        IQueryable<T> GetPagesNoTracking<TS>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> @where, Expression<Func<T, TS>> @orderby, bool isAsc = true);
 
         /// <summary>
         /// 根据ID删除实体
@@ -457,43 +447,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>删除成功</returns>
         Task<int> DeleteEntitySavedAsync(T t);
 
-        /// <summary>
-        /// 更新实体
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        bool UpdateEntity(T t);
-
-        /// <summary>
-        /// 更新实体并保存
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        bool UpdateEntitySaved(T t);
-
-        /// <summary>
-        /// 更新实体并保存(异步)
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        Task<int> UpdateEntitySavedAsync(T t);
-
-        /// <summary>
-        /// 根据条件更新实体
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        int UpdateEntity(Expression<Func<T, bool>> @where, T t);
-
-        /// <summary>
-        /// 根据条件更新实体(异步)
-        /// </summary>
-        /// <param name="where">查询条件</param>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        Task<int> UpdateEntityAsync(Expression<Func<T, bool>> @where, T t);
-
         /// <summary>
         /// 添加实体
         /// </summary>
@@ -562,27 +515,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
         /// <returns>删除成功</returns>
         Task<int> DeleteEntitiesSavedAsync(IEnumerable<T> list);
 
-        /// <summary>
-        /// 更新多个实体
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        bool UpdateEntities(IEnumerable<T> list);
-
-        /// <summary>
-        /// 更新多个实体并保存
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        bool UpdateEntitiesSaved(IEnumerable<T> list);
-
-        /// <summary>
-        /// 更新多个实体并保存(异步)
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        Task<int> UpdateEntitiesSavedAsync(IEnumerable<T> list);
-
         /// <summary>
         /// 添加多个实体并保存
         /// </summary>

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

@@ -20,8 +20,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         public IEnumerable<LeaveMessage> GetSelfAndAllChildrenMessagesByParentId(int id)
         {
-            //return SqlQuery<LeaveMessage>("exec sp_getChildrenLeaveMsgByParentId " + id);
-            LeaveMessage c = GetById(id);
+            LeaveMessage c = GetFromCache(m => m.Id == id);
             var msgs = new List<LeaveMessage>() { c };
             GetSelfAndAllChildrenMessagesByParentId(c, msgs);
             return msgs;
@@ -34,7 +33,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         private void GetSelfAndAllChildrenMessagesByParentId(LeaveMessage msg, List<LeaveMessage> list)
         {
-            var msgs = LoadEntitiesFromL2CacheNoTracking(x => x.ParentId == msg.Id).ToList();
+            var msgs = GetQueryFromCache(x => x.ParentId == msg.Id).ToList();
             if (msgs.Any())
             {
                 list.AddRange(msgs);
@@ -52,7 +51,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         public int GetParentMessageIdByChildId(int id)
         {
-            LeaveMessage msg = GetById(id);
+            LeaveMessage msg = GetFromCache(m => m.Id == id);
             if (msg != null)
             {
                 return GetParentMessageIdByChildId(msg);
@@ -67,7 +66,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         private int GetParentMessageIdByChildId(LeaveMessage m)
         {
-            LeaveMessage msg = GetFirstEntityNoTracking(c => c.Id == m.ParentId);
+            LeaveMessage msg = GetNoTracking(c => c.Id == m.ParentId);
             if (msg != null)
             {
                 return GetParentMessageIdByChildId(msg);

+ 2 - 3
src/Masuit.MyBlogs.Core/Infrastructure/Services/MenuService.cs

@@ -20,8 +20,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         public IEnumerable<Menu> GetChildrenMenusByParentId(int id)
         {
-            //return SqlQuery<Menu>("exec sp_getChildrenMenusByParentId " + id);
-            Menu c = GetById(id);
+            Menu c = GetFromCache(m => m.Id == id);
             var menus = new List<Menu>() { c };
             GetChildrenMenusByParentId(c, menus);
             return menus;
@@ -34,7 +33,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns></returns>
         private void GetChildrenMenusByParentId(Menu menu, List<Menu> list)
         {
-            var menus = LoadEntitiesFromL2CacheNoTracking(x => x.ParentId == menu.Id).ToList();
+            var menus = GetQueryFromCache(x => x.ParentId == menu.Id).ToList();
             if (menus.Any())
             {
                 list.AddRange(menus);

+ 0 - 44
src/Masuit.MyBlogs.Core/Infrastructure/Services/PostService.cs

@@ -210,49 +210,5 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             base.DeleteEntity(t);
             return _searchEngine.SaveChangesAsync();
         }
-
-        /// <summary>
-        /// 更新实体并保存
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public override bool UpdateEntitySaved(Post t)
-        {
-            base.UpdateEntity(t);
-            return _searchEngine.SaveChanges() > 0;
-        }
-
-        /// <summary>
-        /// 更新多个实体并保存
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        public override bool UpdateEntitiesSaved(IEnumerable<Post> list)
-        {
-            base.UpdateEntities(list);
-            return _searchEngine.SaveChanges() > 0;
-        }
-
-        /// <summary>
-        /// 更新多个实体并保存(异步)
-        /// </summary>
-        /// <param name="list">实体集合</param>
-        /// <returns>更新成功</returns>
-        public override Task<int> UpdateEntitiesSavedAsync(IEnumerable<Post> list)
-        {
-            base.UpdateEntities(list);
-            return _searchEngine.SaveChangesAsync();
-        }
-
-        /// <summary>
-        /// 更新实体并保存(异步)
-        /// </summary>
-        /// <param name="t">更新后的实体</param>
-        /// <returns>更新成功</returns>
-        public override Task<int> UpdateEntitySavedAsync(Post t)
-        {
-            base.UpdateEntity(t);
-            return _searchEngine.SaveChangesAsync();
-        }
     }
 }

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

@@ -22,7 +22,7 @@ namespace Service
         /// <returns></returns>
         public UserInfo GetByUsername(string name)
         {
-            return GetFirstEntity(u => u.Username.Equals(name));
+            return Get(u => u.Username.Equals(name));
         }
 
         /// <summary>
@@ -55,7 +55,7 @@ namespace Service
         /// <returns></returns>
         public UserInfo Register(UserInfo userInfo)
         {
-            UserInfo exist = GetFirstEntity(u => u.Username.Equals(userInfo.Username) || u.Email.Equals(userInfo.Email));
+            UserInfo exist = Get(u => u.Username.Equals(userInfo.Username) || u.Email.Equals(userInfo.Email));
             if (exist is null)
             {
                 var salt = $"{new Random().StrictNext()}{DateTime.Now.GetTotalMilliseconds()}".MDString2(Guid.NewGuid().ToString()).AESEncrypt();
@@ -84,7 +84,7 @@ namespace Service
         /// </summary>
         /// <param name="email"></param>
         /// <returns></returns>
-        public bool EmailExist(string email) => GetFirstEntityNoTracking(u => u.Email.Equals(email)) != null;
+        public bool EmailExist(string email) => GetNoTracking(u => u.Email.Equals(email)) != null;
 
         /// <summary>
         /// 修改密码

+ 13 - 16
src/Masuit.MyBlogs.Core/Startup.cs

@@ -87,6 +87,7 @@ namespace Masuit.MyBlogs.Core
         /// <returns></returns>
         public IServiceProvider ConfigureServices(IServiceCollection services)
         {
+            RedisHelper.Initialization(new CSRedisClient(AppConfig.Redis));
             services.Configure<CookiePolicyOptions>(options =>
             {
                 options.MinimumSameSitePolicy = SameSiteMode.None;
@@ -97,37 +98,33 @@ namespace Masuit.MyBlogs.Core
                 //opt.UseSqlServer(AppConfig.ConnString);
             }); //配置数据库
             services.AddCors(opt => opt.AddDefaultPolicy(p => p.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials())); //配置跨域
-
-            services.AddHttpClient("", c => c.Timeout = TimeSpan.FromSeconds(30)); //注入HttpClient
-            services.AddHttpContextAccessor(); //注入静态HttpContext
             services.Configure<FormOptions>(options =>
             {
                 options.MultipartBodyLengthLimit = 104857600; // 100MB
             }); //配置请求长度
+            services.AddSession(); //注入Session
+            services.AddWebSockets(opt => opt.ReceiveBufferSize = 4096 * 1024).AddSignalR();
+            services.AddHttpsRedirection(options =>
+            {
+                options.RedirectStatusCode = StatusCodes.Status301MovedPermanently;
+            });
 
             ConfigureResponse(services);
 
-            services.AddSession(); //注入Session
             services.AddHangfire(x => x.UseMemoryStorage()); //配置hangfire
 
-            services.AddSevenZipCompressor().AddResumeFileResult().AddSearchEngine<DataContext>(new LuceneIndexerOptions()
-            {
-                Path = "lucene"
-            }); // 配置7z和断点续传和Redis和Lucene搜索引擎
-            RedisHelper.Initialization(new CSRedisClient(AppConfig.Redis));
-
             //配置EF二级缓存
             services.AddEFSecondLevelCache();
             // 配置EF二级缓存策略
             services.AddSingleton(typeof(ICacheManager<>), typeof(BaseCacheManager<>));
             services.AddSingleton(new CacheManager.Core.ConfigurationBuilder().WithJsonSerializer().WithMicrosoftMemoryCacheHandle().WithExpiration(ExpirationMode.Sliding, TimeSpan.FromMinutes(10)).Build());
-
-            services.AddWebSockets(opt => opt.ReceiveBufferSize = 4096 * 1024).AddSignalR();
-
-            services.AddHttpsRedirection(options =>
+            services.AddSevenZipCompressor().AddResumeFileResult().AddSearchEngine<DataContext>(new LuceneIndexerOptions()
             {
-                options.RedirectStatusCode = StatusCodes.Status301MovedPermanently;
-            });
+                Path = "lucene"
+            }); // 配置7z和断点续传和Redis和Lucene搜索引擎
+
+            services.AddHttpClient("", c => c.Timeout = TimeSpan.FromSeconds(30)); //注入HttpClient
+            services.AddHttpContextAccessor(); //注入静态HttpContext
 
             services.AddMvc(options =>
             {