EF Core сопоставляет столбцы с коллекцией объектов - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть устаревшая база данных, которая содержит годовые данные в следующем формате (упрощенно):

CategoryId | CategoryName | CountryId | CountryName | Offset | Year0 | Year1 | Year2 | Year3 | Year4 |
------------------------------------------------------------------------------------------------------
         1 | Potatoes     |         2 | Latvia      |   2001 |   123 |   123 |   123 |   123 |   123 |

Как видите, это данные временного ряда, в которых хранятся данные за 5 лет.Исходя из столбца Offset, столбец Year[0-4] будет представлять другой год.

Таким образом, в этом случае это можно читать как:

CategoryId | CategoryName | CountryId | CountryName | 2001 | 2002 | 2003 | 2004 | 2005 |
----------------------------------------------------------------------------------------
         1 | Potatoes     |         2 | Latvia      |  123 |  123 |  123 |  123 |  123 |

Если Offset изменяется, столбец значение также изменяется.

Я буду работать над написанием службы, которая будет использовать эту базу данных, и я хотел бы сопоставить эти результаты с такой структурой:

public class Category
{
    public int Id { get; set; }

    public string Name { get; set; }
}

public class Country
{
    public int Id { get; set; }

    public string Name { get; set; }
}

public class Datum
{
    public int Year { get; set; }

    public decimal Sales { get; set; }
}

public class Experiment
{
    public Category Category { get; set; }

    public Country Country { get; set; }

    public IEnumerable<Datum> Datum { get; set; }
}

Столбцы года должны быть сопоставлены с IEnumerable<Datum>, и тогда весь объект может быть представлен следующим образом:

new Experiment
{
    Category = new Category { Id = 1, Name = "Potatoes" },
    Country = new Country { Id = 2, Name = "Latvia" },
    Datum = new List<Datum>
    {
        new Datum { Year = 2001, Sales = 123 },
        new Datum { Year = 2002, Sales = 123 },
        new Datum { Year = 2002, Sales = 123 },
        new Datum { Year = 2003, Sales = 123 },
        new Datum { Year = 2004, Sales = 123 }
    }
};

Как это можно сделать с помощью EF Core?

ЗапрошеноОбновить.Это не составит труда с Linq, как предлагается в комментариях, но мне было интересно, смогу ли я включить это отображение в EF Core.

class MainClass
{
    public static IEnumerable<DatabaseRow> rows = new List<DatabaseRow>
    {
        new DatabaseRow
        {
            CategoryId = 1,
            CategoryName = "Potatoes",
            CountryId = 2,
            CountryName = "Latvia",
            Offset = 2001,
            Year0 = 123,
            Year1 = 123,
            Year2 = 123,
            Year3 = 123,
            Year4 = 123
        }
    };

    public static void Main (string[] args)
    {
        var transformed = rows.Select(row => new Experiment
        {
            Category = new Category
            {
                Id = row.CategoryId,
                Name = row.CategoryName
            },
            Country = new Country
            {
                Id = row.CountryId,
                Name = row.CountryName
            },
            Datum = new List<Datum>
            {
                new Datum
                {
                  Year = row.Offset,
                  Sales = row.Year0
                },
                new Datum
                {
                  Year = row.Offset + 1,
                  Sales = row.Year1
                },
                new Datum
                {
                  Year = row.Offset + 2,
                  Sales = row.Year2
                },
                new Datum
                {
                  Year = row.Offset + 3,
                  Sales = row.Year3
                },
                new Datum
                {
                  Year = row.Offset + 4,
                  Sales = row.Year4
                }
            }
        });
    }
}

class DatabaseRow
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }

    public int CountryId { get; set; }
    public string CountryName { get; set; }

    public int Offset { get; set; }
    public decimal Year0 { get; set; }
    public decimal Year1 { get; set; }
    public decimal Year2 { get; set; }
    public decimal Year3 { get; set; }
    public decimal Year4 { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...