TLDR; Как мне прочитать данные из таблицы, используя Entity Framework, если имя таблицы неизвестно во время компиляции?
Существует внешняя система, которая обрабатывает большую часть информации, а затем создает новую таблицу для каждого пакетного запуска и сохраняет некоторые данные в этой таблице. Расположение столбцов этих новых таблиц известно заранее, поэтому я сгенерировал модель данных объекта ADO.NET (файл edmx) из существующей базы данных, где есть таблица с точно такой же структурой столбцов. .
Исходная таблица в этой базе данных называется ResultTableTemplate
, поэтому класс сущности, представляющий эту таблицу, также называется ResultTableTemplate
.
Я пытаюсь выяснить, как использовать мою модель данных сущности ADO.NET для чтения из этих динамически созданных таблиц и получения обратно IEnumerable<ResultTableTemplate>
. Что я сделал до сих пор это:
public IEnumerable<ResultTableTemplate> GetResultsFromTable(string tableName) {
using (var context = new WorkdataEntities()) {
var table = context.CreateQuery<ResultTableTemplate>("SELECT " +
"ALL_THOSE_COLUMN_NAMES... " +
"FROM " + tableName;
var query = from item in table select item;
return query.ToList();
}
}
Когда я запускаю запрос, я получаю System.Data.EntitySqlException
со следующим сообщением:
«ResultTable419828» не может быть разрешен в текущей области или
контекст. Убедитесь, что все ссылочные переменные находятся в области видимости, что
необходимые схемы загружены, и на эти пространства имен ссылаются
правильно. Выражение доступа к члену рядом, строка 1, столбец 225.
ResultTable419828
- это значение tableName
Я пытался tableName + " AS ResultTableTemplate"
, но это не помогло.
Есть ли путь для меня вперед, или мне придется делать это без помощи Entity Framework?
EDIT: Теперь я понимаю, что текст запроса, который я пишу, не передается полностью до базового экземпляра SQL Server, а интерпретируется Entity Framework, который возвращает экземпляр ObjectQuery<ResultTableTemplate>
, поэтому он ищет ResultTable419828
среди автоматически сгенерированных DbSet
экземпляров Context.
Тем не менее, есть ли способ для меня добиться того, что мне нужно сделать?
РЕДАКТИРОВАТЬ: Спасибо Ладислав Мрнка . Теперь я делаю это:
public IEnumerable<ResultTableTemplate> GetResultsFromTable(string tableName) {
using (var context = new WorkdataEntities()) {
var query = context.ExecuteStoreQuery<ResultTableTemplate>("SELECT " +
"ALL_THOSE_COLUMN_NAMES... " +
"FROM " + tableName;
return query.ToList();
}
}