forked from StefanTheCode/OptimizeMePlease
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBenchmarkService.cs
111 lines (96 loc) · 4.47 KB
/
BenchmarkService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System;
using System.Collections.Generic;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Configs;
using Microsoft.EntityFrameworkCore;
using OptimizeMePlease.Context;
namespace OptimizeMePlease
{
using Z.EntityFramework.Plus;
[MemoryDiagnoser]
[HideColumns(Column.Job, Column.RatioSD, Column.StdDev, Column.AllocRatio)]
[Config(typeof(Config))]
public class BenchmarkService
{
private class Config : ManualConfig
{
public Config()
{
SummaryStyle = BenchmarkDotNet.Reports.SummaryStyle.Default.WithRatioStyle(RatioStyle.Trend);
}
}
/// <summary>
/// Get top 2 Authors (FirstName, LastName, UserName, Email, Age, Country)
/// from country Serbia aged 27, with the highest BooksCount
/// and all his/her books (Book Name/Title and Publishment Year) published before 1900
/// </summary>
/// <returns></returns>
[Benchmark(Baseline = true)]
public List<Dtos> GetAuthors()
{
using AppDbContext dbContext = new AppDbContext();
List<Dtos> authors = dbContext.Authors
.Include(x => x.User)
.ThenInclude(x => x.UserRoles)
.ThenInclude(x => x.Role)
.Include(x => x.Books)
.ThenInclude(x => x.Publisher)
.ToList()
.Select(x => new Dtos
{
UserCreated = x.User.Created,
UserEmailConfirmed = x.User.EmailConfirmed,
UserFirstName = x.User.FirstName,
UserLastActivity = x.User.LastActivity,
UserLastName = x.User.LastName,
UserEmail = x.User.Email,
UserName = x.User.UserName,
UserId = x.User.Id,
RoleId = x.User.UserRoles.FirstOrDefault(y => y.UserId == x.UserId).RoleId,
BooksCount = x.BooksCount,
AllBooks = x.Books.Select(y => new BookDto
{
Id = y.Id,
Name = y.Name,
Published = y.Published,
ISBN = y.ISBN,
PublisherName = y.Publisher.Name
}).ToList(),
AuthorAge = x.Age,
AuthorCountry = x.Country,
AuthorNickName = x.NickName,
Id = x.Id
})
.ToList()
.Where(x => x.AuthorCountry == "Serbia" && x.AuthorAge == 27)
.ToList();
List<Dtos> orderedAuthors = authors.OrderByDescending(x => x.BooksCount).ToList().Take(2).ToList();
List<Dtos> finalAuthors = new List<Dtos>();
foreach (Dtos author in orderedAuthors)
{
List<BookDto> books = new List<BookDto>();
List<BookDto> allBooks = author.AllBooks;
foreach (BookDto book in allBooks)
{
if (book.Published.Year < 1900)
{
book.PublishedYear = book.Published.Year;
books.Add(book);
}
}
author.AllBooks = books;
finalAuthors.Add(author);
}
return finalAuthors;
}
[Benchmark]
public List<AuthorDTO_Optimized> GetAuthors_Optimized()
{
using AppDbContext dbContext = new AppDbContext();
//Write your query here
return null;
}
}
}