using Bogus; using BulletinBoardContracts.BindingModels; using BulletinBoardContracts.SearchModels; using BulletinBoardContracts.StoragesContracts; using BulletinBoardContracts.ViewModels; using BulletinBoardDatabase.Models; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BulletinBoardDatabase.Implements { public class AnnouncementStorage : IAnnouncementStorage { public void ClearEntity() { using var context = new BulletinBoardDatabase(); string deleteAllQuery = "DELETE FROM \"Announcements\""; context.Database.ExecuteSqlRaw(deleteAllQuery); } public string TestInsertList(int num) { Random rnd = new Random(); var faker = new Faker("ru"); using var context = new BulletinBoardDatabase(); var users = context.Users .Select(x => x.GetViewModel) .ToList(); var categories = context.Announcements .Include(x => x.Category) .Select(x => x.GetViewModel) .ToList(); var regions = context.Announcements .Include(x => x.Region) .Select(x => x.GetViewModel) .ToList(); for (int i = 0; i < num; ++i) { var model = new AnnouncementBindingModel { StartDate = DateTime.SpecifyKind(faker.Date.Past(), DateTimeKind.Utc), UserId = users[rnd.Next(users.Count)].Id, CategoryId = categories[rnd.Next(categories.Count)].Id, RegionId = regions[rnd.Next(regions.Count)].Id, }; context.Announcements.Add(Announcement.Create(model)); } Stopwatch stopwatch = new(); stopwatch.Start(); context.SaveChanges(); stopwatch.Stop(); return stopwatch.ElapsedMilliseconds.ToString(); } public string TestReadList(int num) { using var context = new BulletinBoardDatabase(); Stopwatch stopwatch = new(); stopwatch.Start(); List list = context.Announcements .Take(num) .Select(x => x.GetViewModel) .ToList(); stopwatch.Stop(); return stopwatch.ElapsedMilliseconds.ToString(); } public string TestJoinReadList(int num) { using var context = new BulletinBoardDatabase(); Stopwatch stopwatch = new(); stopwatch.Start(); var list = context.Announcements .Include(x => x.Category) .Include(x => x.User) .Include(x => x.Region) .Join(context.Users, a => a.UserId, u => u.Id, (a, u) => new { Announcement = a, User = u }) .Join(context.Categories, ac => ac.Announcement.CategoryId, category => category.Id, (ac, category) => new { ac.Announcement, ac.User, Category = category }) .Join(context.Regions, ar => ar.Announcement.RegionId, region => region.Id, (ar, region) => new { ar.Announcement, ar.User, ar.Category, Region = region }) .Select(rc => new { Announcement = rc.Announcement.GetViewModel, User = rc.User.GetViewModel, Category = rc.Category.GetViewModel, Region = rc.Region.GetViewModel, }) .Take(num) .ToList(); stopwatch.Stop(); return stopwatch.ElapsedMilliseconds.ToString(); } public AnnouncementViewModel? GetElement(AnnouncementSearchModel model) { if (!model.Id.HasValue) { return null; } using var context = new BulletinBoardDatabase(); return context.Announcements .Include(x => x.Category) .Include(x => x.User) .Include(x => x.Region) .FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id)) ?.GetViewModel; } public List GetFilteredList(AnnouncementSearchModel model) { if (!model.Id.HasValue && !model.UserId.HasValue) { return new(); } using var context = new BulletinBoardDatabase(); return context.Announcements .Include(x => x.Category) .Include(x => x.User) .Include(x => x.Region) .Where(x => x.UserId == model.UserId) .Select(x => x.GetViewModel) .ToList(); } public List GetFullList() { using var context = new BulletinBoardDatabase(); return context.Announcements .Include(x => x.Category) .Include(x => x.User) .Include(x => x.Region) .Select(x => x.GetViewModel) .ToList(); } public AnnouncementViewModel? Insert(AnnouncementBindingModel model) { var newAnnouncement = Announcement.Create(model); if (newAnnouncement == null) { return null; } using var context = new BulletinBoardDatabase(); context.Announcements.Add(newAnnouncement); context.SaveChanges(); return newAnnouncement.GetViewModel; } public AnnouncementViewModel? Update(AnnouncementBindingModel model) { using var context = new BulletinBoardDatabase(); var component = context.Announcements.FirstOrDefault(x => x.Id == model.Id); if (component == null) { return null; } component.Update(model); context.SaveChanges(); return component.GetViewModel; } public AnnouncementViewModel? Delete(AnnouncementBindingModel model) { using var context = new BulletinBoardDatabase(); var element = context.Announcements.FirstOrDefault(rec => rec.Id == model.Id); if (element != null) { context.Announcements.Remove(element); context.SaveChanges(); return element.GetViewModel; } return null; } } }