Возможно ли запустить запрос SQL select для динамического имени таблицы?

Я создаю динамическую таблицу, когда веб-сайт активен с помощью этого кода:

public void CreateTable(string tableName, string field1, double field2, ...)
{
  string Raw = string.Format("CREATE TABLE [{0}] ([ID] UNIQUEIDENTIFIER NOT NULL, [{1}] NVARCHAR (MAX) NOT NULL, [{2}] FLOAT NOT NULL, ..., , CONSTRAINT[PK_{0}] PRIMARY KEY CLUSTERED([ID] ASC);", tableName, field1, field2);
  _context.Database.ExecuteSqlRaw(Raw);
  _context.SaveChanges();
}

Теперь я хочу запустить запрос SQL, выбрав что-то вроде этого:

private readonly ApplicationDbContext _context;
public HomeController(ApplicationDbContext context)
{
   _context = context;
}
public void List(string tableName)
{
   string Raw = string.Format("SELECT * FROM [{0}];", tableName);
   var table = _context.Database.ExecuteSqlRaw(Raw);
   //--- Do something with table here
}

ПРИМЕЧАНИЕ. Я пытаюсь использовать отражение следующим образом:

var table = _context.GetType().GetProperty(tableName).GetValue(_context) as IQueryable;

Но не работает и возвращает NULL.

Я все еще новичок в C#, очень признателен, если вы можете показать мне пример, основанный на этом коде.


person Xerxes Asimov    schedule 10.04.2020    source источник
comment
Вы пытались использовать добавление схемы к имени таблицы.   -  person KingOfArrows    schedule 10.04.2020
comment
Какой результат вы хотите? С какой проблемой вы столкнулись с этим кодом?   -  person Chetan Ranpariya    schedule 10.04.2020
comment
@KingOfArrows, можешь подробнее объяснить?   -  person Xerxes Asimov    schedule 10.04.2020
comment
@ChetanRanpariya Я хочу получить список этой таблицы для поиска или редактирования и ...   -  person Xerxes Asimov    schedule 10.04.2020
comment
Привет, @XerxesAsimov. Итак, вы пытались отформатировать свой оператор выбора следующим образом: "SELECT * FROM dbo.[{0}]". Я предполагаю, что схема вновь созданных таблиц находится в dbo.   -  person KingOfArrows    schedule 10.04.2020
comment
@KingOfArrows Да, я пытался, но вернул -1, спасибо за комментарий.   -  person Xerxes Asimov    schedule 10.04.2020
comment
Привет, @XerxesAsimov. Просто хочу дважды проверить, что таблица действительно существует в базе данных. Если это так, вы можете проверить, какие разрешения имеет эта таблица для учетной записи, которую приложение использует для входа в базу данных.   -  person KingOfArrows    schedule 10.04.2020
comment
@KingOfArrows Хорошо, я еще раз проверю и сообщу вам.   -  person Xerxes Asimov    schedule 10.04.2020
comment
Эй, @KingOfArrows, я дважды проверяю, что таблица действительно существует в базе данных, и я проверяю Разрешение на защищаемый контейнер, которое подразумевает детализированное разрешение на базовое защищаемое, это ИЗМЕНИТЬ ЛЮБУЮ РОЛЬ ПРИЛОЖЕНИЯ. Еще раз спасибо за комментарий.   -  person Xerxes Asimov    schedule 10.04.2020


Ответы (1)


вы можете сделать это с помощью команды для получения динамических объектов.

сначала создайте функцию для получения строки данных.

 public static IEnumerable<dynamic> CollectionFromSql(this DbContext dbContext, string Sql, Dictionary<string, object> Parameters)
{
    using (var cmd = dbContext.Database.GetDbConnection().CreateCommand())
    {
        cmd.CommandText = Sql;
        if (cmd.Connection.State != ConnectionState.Open)
            cmd.Connection.Open();

        foreach (KeyValuePair<string, object> param in Parameters)
        {
            DbParameter dbParameter = cmd.CreateParameter();
            dbParameter.ParameterName = param.Key;
            dbParameter.Value = param.Value;
            cmd.Parameters.Add(dbParameter);
        }

        //var retObject = new List<dynamic>();
        using (var dataReader = cmd.ExecuteReader())
        {

            while (dataReader.Read())
            {
                var dataRow = GetDataRow(dataReader);
                yield return dataRow ;

            }
        }


    }
}

Затем добавьте данные в динамические объекты.

private static dynamic GetDataRow(DbDataReader dataReader)
{
    var dataRow = new ExpandoObject() as IDictionary<string, object>;
    for (var fieldCount = 0; fieldCount < dataReader.FieldCount; fieldCount++)
        dataRow.Add(dataReader.GetName(fieldCount), dataReader[fieldCount]);
    return dataRow;
}

вы можете использовать так:

List<dynamic> MyList = MyDbContext.CollectionFromSql("SELECT * FROM @tableName",
        new Dictionary<string, object> { { "@tableName", tableName } }).ToList();
person liang.good    schedule 10.04.2020
comment
спасибо за ответ, в настоящее время я использую точно такой же способ, но я ищу другой способ, например, с помощью ExecuteSqlRaw. - person Xerxes Asimov; 10.04.2020