Ядро EF сопоставляет столбцы с коллекцией объектов

#c# #entity-framework-core

#c# #entity-framework-core

Вопрос:

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

 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; }
}
  

Столбцы Year должны быть сопоставлены 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?

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

 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; }
}
  

Комментарии:

1. Я думаю, что это вопрос linq, а не ef core. Кроме того, что вы пробовали до сих пор?

2. @PaoloGo Я имел в виду, что это выполнимо с помощью Linq, обновленный вопрос с возможным решением. Я мог бы полностью сохранить этот код в репозитории, но я бы предпочел избежать этого, если это возможно.

3. @EvaldasBuinauskas Вы могли бы использовать DTO, но я предполагаю, что вы хотите, чтобы EF сделал это, если это так. Просто выполните сопоставление со списком в конструкторе

4. Я бы предпочел использовать EF, но если это сложно и неразумно, я бы предпочел отложить его в сторону.