#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, но если это сложно и неразумно, я бы предпочел отложить его в сторону.