diff --git a/ProjectHorseRacingOrg/Entities/RaceEntries.cs b/ProjectHorseRacingOrg/Entities/RaceEntries.cs index 295f102..88b79c1 100644 --- a/ProjectHorseRacingOrg/Entities/RaceEntries.cs +++ b/ProjectHorseRacingOrg/Entities/RaceEntries.cs @@ -11,21 +11,32 @@ public class RaceEntries public int Id { get; private set; } public int JockeyId { get; private set; } public DateTime DateReceipt { get; private set; } - public IEnumerable RaceEntryDetails - { - get; - private set; - } = []; + + public IEnumerable RacesEntryDetails { get; private set; } = []; + public static RaceEntries CreateOpeartion(int id, int jockeyId, - IEnumerable raceEntryDetails) + IEnumerable racesEntryDetails) { return new RaceEntries { Id = id, JockeyId = jockeyId, DateReceipt = DateTime.Now, - RaceEntryDetails = raceEntryDetails + RacesEntryDetails = racesEntryDetails }; } + public static RaceEntries CreateOpeartion(TempRaceEntryDetails tempRaceEntryDetails, +IEnumerable racesEntryDetails) + { + return new RaceEntries + { + Id = tempRaceEntryDetails.Id, + JockeyId = tempRaceEntryDetails.JockeyId, + DateReceipt = tempRaceEntryDetails.DateReceipt, + RacesEntryDetails = racesEntryDetails + }; + } + + } diff --git a/ProjectHorseRacingOrg/Entities/TempRaceEntryDetails.cs b/ProjectHorseRacingOrg/Entities/TempRaceEntryDetails.cs new file mode 100644 index 0000000..67055c6 --- /dev/null +++ b/ProjectHorseRacingOrg/Entities/TempRaceEntryDetails.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectHorseRacingOrg.Entities; + +public class TempRaceEntryDetails +{ + public int Id { get; private set; } + public int JockeyId { get; private set; } + public DateTime DateReceipt { get; private set; } + public int RaceId { get; private set; } + public int Count { get; private set; } +} diff --git a/ProjectHorseRacingOrg/Forms/FormRaceEntries.cs b/ProjectHorseRacingOrg/Forms/FormRaceEntries.cs index b10b058..c3278da 100644 --- a/ProjectHorseRacingOrg/Forms/FormRaceEntries.cs +++ b/ProjectHorseRacingOrg/Forms/FormRaceEntries.cs @@ -70,7 +70,8 @@ namespace ProjectHorseRacingOrg.Forms Convert.ToInt32(row.Cells["ColumnRace"].Value), Convert.ToInt32(row.Cells["ColumnCount"].Value))); } - return list; + return list.GroupBy(x => x.RaceId, x => x.Count, (id, counts) => + RaceEntryDetails.CreateElement(0, id, counts.Sum())).ToList(); } } diff --git a/ProjectHorseRacingOrg/Forms/FormRaceReport.Designer.cs b/ProjectHorseRacingOrg/Forms/FormRaceReport.Designer.cs new file mode 100644 index 0000000..be9fb5b --- /dev/null +++ b/ProjectHorseRacingOrg/Forms/FormRaceReport.Designer.cs @@ -0,0 +1,163 @@ +namespace ProjectHorseRacingOrg.Forms +{ + partial class FormRaceReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dateTimePickerDateBegin = new DateTimePicker(); + dateTimePickerDateEnd = new DateTimePicker(); + ButtonMakeReport = new Button(); + labelWay = new Label(); + labelRace = new Label(); + labelBegin = new Label(); + labelEnd = new Label(); + buttonSelectFilePath = new Button(); + textBoxFilePath = new TextBox(); + comboBoxRace = new ComboBox(); + SuspendLayout(); + // + // dateTimePickerDateBegin + // + dateTimePickerDateBegin.Location = new Point(164, 159); + dateTimePickerDateBegin.Name = "dateTimePickerDateBegin"; + dateTimePickerDateBegin.Size = new Size(262, 27); + dateTimePickerDateBegin.TabIndex = 0; + // + // dateTimePickerDateEnd + // + dateTimePickerDateEnd.Location = new Point(164, 214); + dateTimePickerDateEnd.Name = "dateTimePickerDateEnd"; + dateTimePickerDateEnd.Size = new Size(262, 27); + dateTimePickerDateEnd.TabIndex = 1; + // + // ButtonMakeReport + // + ButtonMakeReport.Location = new Point(164, 270); + ButtonMakeReport.Name = "ButtonMakeReport"; + ButtonMakeReport.Size = new Size(136, 29); + ButtonMakeReport.TabIndex = 2; + ButtonMakeReport.Text = "Сформировать"; + ButtonMakeReport.UseVisualStyleBackColor = true; + ButtonMakeReport.Click += ButtonMakeReport_Click; + // + // labelWay + // + labelWay.AutoSize = true; + labelWay.Location = new Point(37, 36); + labelWay.Name = "labelWay"; + labelWay.Size = new Size(112, 20); + labelWay.TabIndex = 3; + labelWay.Text = "Путь до файла:"; + // + // labelRace + // + labelRace.AutoSize = true; + labelRace.Location = new Point(37, 98); + labelRace.Name = "labelRace"; + labelRace.Size = new Size(115, 20); + labelRace.TabIndex = 4; + labelRace.Text = "Соревнование:"; + // + // labelBegin + // + labelBegin.AutoSize = true; + labelBegin.Location = new Point(37, 159); + labelBegin.Name = "labelBegin"; + labelBegin.Size = new Size(97, 20); + labelBegin.TabIndex = 5; + labelBegin.Text = "Дата начала:"; + // + // labelEnd + // + labelEnd.AutoSize = true; + labelEnd.Location = new Point(37, 219); + labelEnd.Name = "labelEnd"; + labelEnd.Size = new Size(90, 20); + labelEnd.TabIndex = 6; + labelEnd.Text = "Дата конца:"; + // + // buttonSelectFilePath + // + buttonSelectFilePath.Location = new Point(390, 31); + buttonSelectFilePath.Name = "buttonSelectFilePath"; + buttonSelectFilePath.Size = new Size(36, 29); + buttonSelectFilePath.TabIndex = 7; + buttonSelectFilePath.Text = ".."; + buttonSelectFilePath.UseVisualStyleBackColor = true; + buttonSelectFilePath.Click += ButtonSelectFilePath_Click; + // + // textBoxFilePath + // + textBoxFilePath.Location = new Point(164, 33); + textBoxFilePath.Name = "textBoxFilePath"; + textBoxFilePath.ReadOnly = true; + textBoxFilePath.Size = new Size(220, 27); + textBoxFilePath.TabIndex = 8; + // + // comboBoxRace + // + comboBoxRace.FormattingEnabled = true; + comboBoxRace.Location = new Point(164, 95); + comboBoxRace.Name = "comboBoxRace"; + comboBoxRace.Size = new Size(262, 28); + comboBoxRace.TabIndex = 9; + // + // FormRaceReport + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(475, 322); + Controls.Add(comboBoxRace); + Controls.Add(textBoxFilePath); + Controls.Add(buttonSelectFilePath); + Controls.Add(labelEnd); + Controls.Add(labelBegin); + Controls.Add(labelRace); + Controls.Add(labelWay); + Controls.Add(ButtonMakeReport); + Controls.Add(dateTimePickerDateEnd); + Controls.Add(dateTimePickerDateBegin); + Name = "FormRaceReport"; + Text = "FormRaceReport"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private DateTimePicker dateTimePickerDateBegin; + private DateTimePicker dateTimePickerDateEnd; + private Button ButtonMakeReport; + private Label labelWay; + private Label labelRace; + private Label labelBegin; + private Label labelEnd; + private Button buttonSelectFilePath; + private TextBox textBoxFilePath; + private ComboBox comboBoxRace; + } +} \ No newline at end of file diff --git a/ProjectHorseRacingOrg/Forms/FormRaceReport.cs b/ProjectHorseRacingOrg/Forms/FormRaceReport.cs new file mode 100644 index 0000000..f8577b5 --- /dev/null +++ b/ProjectHorseRacingOrg/Forms/FormRaceReport.cs @@ -0,0 +1,88 @@ +using ProjectHorseRacingOrg.Reports; +using ProjectHorseRacingOrg.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectHorseRacingOrg.Forms +{ + public partial class FormRaceReport : Form + { + private readonly IUnityContainer _container; + public FormRaceReport(IUnityContainer container, IRaceRepository raceRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + comboBoxRace.DataSource = raceRepository.ReadRaces(); + comboBoxRace.DisplayMember = "Name"; + comboBoxRace.ValueMember = "Id"; + } + private void ButtonSelectFilePath_Click(object sender, EventArgs e) + { + var sfd = new SaveFileDialog() + { + Filter = "Excel Files | *.xlsx" + }; + + if (sfd.ShowDialog() != DialogResult.OK) + { + return; + } + textBoxFilePath.Text = sfd.FileName; + } + private void ButtonMakeReport_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxFilePath.Text)) + { + throw new Exception("Отсутствует имя файла для отчета"); + } + + if (comboBoxRace.SelectedIndex < 0) + { + throw new Exception("Не выбран корм"); + } + + if (dateTimePickerDateBegin.Value >= + dateTimePickerDateEnd.Value) + { + throw new Exception("Дата начала должна быть раньше даты окончания"); + } + + + if + (_container.Resolve().CreateTable(textBoxFilePath.Text, + (int)comboBoxRace.SelectedValue!, + dateTimePickerDateBegin.Value, dateTimePickerDateEnd.Value)) + { + MessageBox.Show("Документ сформирован", + "Формирование документа", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + + else + { + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", + "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании очета", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + } +} diff --git a/ProjectHorseRacingOrg/Forms/FormRaceReport.resx b/ProjectHorseRacingOrg/Forms/FormRaceReport.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectHorseRacingOrg/Forms/FormRaceReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectHorseRacingOrg/Reports/ExcelBuilder.cs b/ProjectHorseRacingOrg/Reports/ExcelBuilder.cs new file mode 100644 index 0000000..e40ec66 --- /dev/null +++ b/ProjectHorseRacingOrg/Reports/ExcelBuilder.cs @@ -0,0 +1,311 @@ +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using DocumentFormat.OpenXml; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectHorseRacingOrg.Reports; + + + public class ExcelBuilder + { + private readonly string _filePath; + private readonly SheetData _sheetData; + private readonly MergeCells _mergeCells; + private readonly Columns _columns; + private uint _rowIndex = 0; + + public ExcelBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + _filePath = filePath; + _sheetData = new SheetData(); + _mergeCells = new MergeCells(); + _columns = new Columns(); + _rowIndex = 1; + } + + public ExcelBuilder AddHeader(string header, int startIndex, int count) + { + CreateCell(startIndex, _rowIndex, header, + StyleIndex.SimpleTextWithoutBorder); + for (int i = startIndex + 1; i < startIndex + count; ++i) + { + CreateCell(i, _rowIndex, "", StyleIndex.SimpleTextWithoutBorder); + } + _mergeCells.Append(new MergeCell() + { + Reference = new StringValue($"{GetExcelColumnName(startIndex)}{_rowIndex}:{GetExcelColumnName(startIndex + count - 1)}{_rowIndex}") + }); + _rowIndex++; + return this; + } + + public ExcelBuilder AddParagraph(string text, int columnIndex) + { + CreateCell(columnIndex, _rowIndex++, text, StyleIndex.SimpleTextWithoutBorder); + return this; + } + public ExcelBuilder AddTable(int[] columnsWidths, List data) + { + if (columnsWidths == null || columnsWidths.Length == 0) + { + throw new ArgumentNullException(nameof(columnsWidths)); + } + if (data == null || data.Count == 0) + { + throw new ArgumentNullException(nameof(data)); + } + if (data.Any(x => x.Length != columnsWidths.Length)) + { + throw new InvalidOperationException("widths.Length != data.Length"); + } + uint counter = 1; + int coef = 2; + _columns.Append(columnsWidths.Select(x => new Column + { + Min = counter, + Max = counter++, + Width = x * coef, + CustomWidth = true + })); + for (var j = 0; j < data.First().Length; ++j) + { + CreateCell(j, _rowIndex, data.First()[j], StyleIndex.SimpleTextWithoutBorder); + } + _rowIndex++; + for (var i = 1; i < data.Count - 1; ++i) + { + for (var j = 0; j < data[i].Length; ++j) + { + CreateCell(j, _rowIndex, data[i][j], StyleIndex.SimpleTextWithBorder); + } + _rowIndex++; + } + for (var j = 0; j < data.Last().Length; ++j) + { + CreateCell(j, _rowIndex, data.Last()[j], StyleIndex.BoldTextWithBorder); + } + _rowIndex++; + return this; + } + + public void Build() + { + using var spreadsheetDocument = SpreadsheetDocument.Create(_filePath, SpreadsheetDocumentType.Workbook); + var workbookpart = spreadsheetDocument.AddWorkbookPart(); + GenerateStyle(workbookpart); + workbookpart.Workbook = new Workbook(); + var worksheetPart = workbookpart.AddNewPart(); + worksheetPart.Worksheet = new Worksheet(); + if (_columns.HasChildren) + { + worksheetPart.Worksheet.Append(_columns); + } + worksheetPart.Worksheet.Append(_sheetData); + var sheets = spreadsheetDocument.WorkbookPart!.Workbook.AppendChild(new Sheets()); + var sheet = new Sheet() + { + Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), + SheetId = 1, + Name = "Лист 1" + }; + sheets.Append(sheet); + if (_mergeCells.HasChildren) + { + worksheetPart.Worksheet.InsertAfter(_mergeCells, worksheetPart.Worksheet.Elements().First()); + } + } + + private static void GenerateStyle(WorkbookPart workbookPart) + { + var workbookStylesPart = workbookPart.AddNewPart(); + workbookStylesPart.Stylesheet = new Stylesheet(); + var fonts = new Fonts() + { + Count = 2, + KnownFonts = BooleanValue.FromBoolean(true) + }; + fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font + { + FontSize = new FontSize() { Val = 11 }, + FontName = new FontName() { Val = "Calibri" }, + FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 }, + FontScheme = new FontScheme() + { + Val = new EnumValue(FontSchemeValues.Minor) + } + }); + + fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font + { + FontSize = new FontSize() { Val = 11 }, + FontName = new FontName() { Val = "Calibri" }, + Bold = new Bold(), + FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 }, + FontScheme = new FontScheme() + { + Val = new EnumValue(FontSchemeValues.Minor) + } + }); + workbookStylesPart.Stylesheet.Append(fonts); + // Default Fill + var fills = new Fills() { Count = 1 }; + fills.Append(new Fill + { + PatternFill = new PatternFill() + { + PatternType = new EnumValue(PatternValues.None) + } + }); + workbookStylesPart.Stylesheet.Append(fills); + // Default Border + var borders = new Borders() { Count = 2 }; + borders.Append(new Border + { + LeftBorder = new LeftBorder(), + RightBorder = new RightBorder(), + TopBorder = new TopBorder(), + BottomBorder = new BottomBorder(), + DiagonalBorder = new DiagonalBorder() + }); + + borders.Append(new Border + { + LeftBorder = new LeftBorder() { Style = BorderStyleValues.Medium }, + RightBorder = new RightBorder() { Style = BorderStyleValues.Medium }, + TopBorder = new TopBorder() { Style = BorderStyleValues.Medium }, + BottomBorder = new BottomBorder() { Style = BorderStyleValues.Medium }, + DiagonalBorder = new DiagonalBorder() { Style = BorderStyleValues.Medium }, + }); + workbookStylesPart.Stylesheet.Append(borders); + // Default cell format and a date cell format + var cellFormats = new CellFormats() { Count = 4 }; + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 0, + BorderId = 0, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Left, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + + cellFormats.Append(new CellFormat + { + NumberFormatId = 1, + FormatId = 0, + FontId = 1, + BorderId = 0, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Left, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + cellFormats.Append(new CellFormat + { + NumberFormatId = 2, + FormatId = 0, + FontId = 0, + BorderId = 1, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Left, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + cellFormats.Append(new CellFormat + { + NumberFormatId = 3, + FormatId = 0, + FontId = 1, + BorderId = 1, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Left, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + workbookStylesPart.Stylesheet.Append(cellFormats); + } + + private enum StyleIndex + { + SimpleTextWithoutBorder = 0, + SimpleTextWithBorder = 1, + BoldTextWithoutBorder = 2, + BoldTextWithBorder = 3, + } + + private void CreateCell(int columnIndex, uint rowIndex, string text, StyleIndex styleIndex) + { + var columnName = GetExcelColumnName(columnIndex); + var cellReference = columnName + rowIndex; + var row = _sheetData.Elements().FirstOrDefault(r => r.RowIndex! == rowIndex); + if (row == null) + { + row = new Row() { RowIndex = rowIndex }; + _sheetData.Append(row); + } + var newCell = row.Elements().FirstOrDefault(c => c.CellReference != null && c.CellReference.Value == columnName + rowIndex); + if (newCell == null) + { + Cell? refCell = null; + foreach (Cell cell in row.Elements()) + { + if (cell.CellReference?.Value != null && cell.CellReference.Value.Length == cellReference.Length) + { + if (string.Compare(cell.CellReference.Value, cellReference, true) > 0) + { + refCell = cell; + break; + } + } + } + newCell = new Cell() { CellReference = cellReference }; + row.InsertBefore(newCell, refCell); + } + newCell.CellValue = new CellValue(text); + newCell.DataType = CellValues.String; + newCell.StyleIndex = (uint)styleIndex; + } + + private static string GetExcelColumnName(int columnNumber) + { + columnNumber += 1; + int dividend = columnNumber; + string columnName = string.Empty; + int modulo; + while (dividend > 0) + { + modulo = (dividend - 1) % 26; + columnName = Convert.ToChar(65 + modulo).ToString() + + columnName; + dividend = (dividend - modulo) / 26; + } + return columnName; + } + + } diff --git a/ProjectHorseRacingOrg/Reports/TableReport.cs b/ProjectHorseRacingOrg/Reports/TableReport.cs new file mode 100644 index 0000000..206f541 --- /dev/null +++ b/ProjectHorseRacingOrg/Reports/TableReport.cs @@ -0,0 +1,70 @@ +using Microsoft.Extensions.Logging; +using ProjectHorseRacingOrg.Entities; +using ProjectHorseRacingOrg.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectHorseRacingOrg.Reports; + +internal class TableReport +{ + private readonly IRaceEntriesRepository _raceEntriesRepository; + private readonly IRacingHorsesRepository _racingHorsesRepository; + private readonly ILogger _logger; + internal static readonly string[] item = ["Жокей", "Дата", "Количество пришло", "Количество ушло"]; + public TableReport(IRaceEntriesRepository raceEntriesRepositor, + IRacingHorsesRepository racingHorsesRepository, + ILogger logger) + + { + _raceEntriesRepository = raceEntriesRepositor ?? throw new ArgumentNullException(nameof(raceEntriesRepositor)); + + _racingHorsesRepository = racingHorsesRepository ?? throw new ArgumentNullException(nameof(racingHorsesRepository)); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + public bool CreateTable(string filePath, int raceId, DateTime startDate, + DateTime endDate) + { + try + { + new ExcelBuilder(filePath) + .AddHeader("Сводка по движению соревнований", 0, 4) + .AddParagraph("за период", 0) + .AddTable([10, 10, 15, 15], GetData(raceId, startDate, endDate)) + .Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + private List GetData(int raceId, DateTime startDate, DateTime endDate) + { + var data = _raceEntriesRepository + .ReadRaceEntries() + .Where(x => x.DateReceipt >= startDate && x.DateReceipt <= endDate && x.RacesEntryDetails.Any(y => y.RaceId == raceId)) + .Select(x => new { x.JockeyId, Date = x.DateReceipt, CountIn = x.RacesEntryDetails.FirstOrDefault(y => y.RaceId == raceId)?.Count, CountOut = (int?)null }) + .Union( + _racingHorsesRepository + .ReadRacingHorses() + .Where(x => x.RacingDate >= startDate && x.RacingDate <= endDate && x.RaceId == raceId) + .Select(x => new { x.JockeyId, Date = x.RacingDate, CountIn = (int?)null, CountOut = (int?)x.Result })) + .OrderBy(x => x.Date); + + return + new List() { item } + .Union( + data + .Select(x => new string[] { x.JockeyId.ToString(), x.Date.ToString(), x.CountIn?.ToString() ?? string.Empty, x.CountOut?.ToString() ?? string.Empty})) + + .Union( + [["Всего", "", data.Sum(x => x.CountIn ?? 0).ToString(), data.Sum(x => x.CountOut ?? 0).ToString()]]) + .ToList(); + } +} diff --git a/ProjectHorseRacingOrg/Repositories/Implementations/RaceEntriesRepository.cs b/ProjectHorseRacingOrg/Repositories/Implementations/RaceEntriesRepository.cs index 1e3c92d..3bfb1be 100644 --- a/ProjectHorseRacingOrg/Repositories/Implementations/RaceEntriesRepository.cs +++ b/ProjectHorseRacingOrg/Repositories/Implementations/RaceEntriesRepository.cs @@ -44,7 +44,7 @@ SELECT MAX(Id) FROM RaceEntries"; var querySubInsert = @" INSERT INTO RaceEntryDetails (RaceEntryId, RaceId, Count) VALUES (@RaceEntryId,@RaceId, @Count)"; - foreach (var elem in raceEntries.RaceEntryDetails) + foreach (var elem in raceEntries.RacesEntryDetails) { connection.Execute(querySubInsert, new { @@ -88,20 +88,24 @@ WHERE Id=@id"; _logger.LogInformation("Получение всех объектов"); try { - using var connection = new - NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM RaceEntries"; - var raceEntries = - connection.Query(querySelect); - _logger.LogDebug("Полученные объекты: {json}", - JsonConvert.SerializeObject(raceEntries)); - return raceEntries; + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT fr.*, ffr.RaceId, ffr.Count FROM RaceEntries fr +INNER JOIN RaceEntryDetails ffr ON ffr.RaceEntryId = fr.Id"; + + var racesEntries = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(racesEntries)); + + return racesEntries.GroupBy(x => x.Id, y => y, + (key, value) => + RaceEntries.CreateOpeartion(value.First(), + value.Select(z => + RaceEntryDetails.CreateElement(0, z.RaceId, z.Count)))).ToList(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); throw; } - } }