У меня есть устаревшая база данных, которая содержит годовые данные в следующем формате (упрощенно):
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; }
}