Как обрабатывать динамические имена таблиц - PullRequest
2 голосов
/ 22 апреля 2019

У меня есть несколько таблиц, которые мне нужно объединить в одну структуру, используя Linq

Мне нужно обработать несколько таблиц, которые имеют одинаковую структуру, но разные имена таблиц (финансовые данные распределены по 20 годам),Я могу создать код для динамического доступа к различным содержимым таблицы:

string tableName = "Trading.DataSources.Prices2017";
var results = DbContext.Set(Type.GetType(tableName));

Однако, когда я пытаюсь преобразовать результаты из одной таблицы в общую таблицу (цена, которая имеет такую ​​же структуру таблицы) с помощью Cast:

var newResults = results.AsQueryable().Cast<Price>().ToList();

Я получаю следующую ошибку:

«System.NotSupportedException:« Невозможно привести тип «Trading.DataSources.Prices2017» к типу «Trading.DataSources.Price»'. LINQ to Entities поддерживает только приведение типов примитивов и перечислений EDM.' '

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

Есть ли способ справиться с этим динамически (или вообще)?

1 Ответ

1 голос
/ 23 апреля 2019

Создайте новую модель класса SharedPrices. Этот класс будет содержать все те же значения, что и эти таблицы

var newResults = results.select(r => new SharedPrices{value1 = r.value1, value2 = r.value2}).ToList();

для моего примера все таблицы цен содержат:

  • value1
  • значение2

Они должны заменить вашу фактическую структуру класса.

Я немного больше покопался для вас, и я хотел бы поблагодарить @ Tyler-Long за его ответ здесь . Его ответ, по сути, указывает на то, что вы можете использовать сериализацию JSON (De) для отражения одного класса в другой без необходимости писать приведение, если у них есть точные одинаковые свойства, например:

using Newtonsoft.Json;

string tableName = "Trading.DataSources.Prices2017";
var tableType = Type.GetType(tableName);
var results = DbContext.Set(tableType);
Price newResults = JsonConvert.DeserializeObject<tableType>(JsonConvert.SerializeObject(results.ToList()));

Я думаю, что это даст вам возможность конвертировать ваши таблицы в единую ценовую модель без необходимости явно писать логику преобразования. Единственным недостатком является то, что он добавляет зависимость к вашему проекту в пакете Newtonsoft.json (который может быть удален через nuget). Впрочем, раньше я лично пользовался этим пакетом, и он надежен.

...