211 lines
5.6 KiB
C#
211 lines
5.6 KiB
C#
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<AnnouncementViewModel> 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<AnnouncementViewModel> 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<AnnouncementViewModel> 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;
|
|
}
|
|
}
|
|
}
|