Это возможно выполнить запрос SQL оператор выбора по имени динамически таблицы? - PullRequest
0 голосов
/ 10 апреля 2020

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

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.

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

1 Ответ

0 голосов
/ 10 апреля 2020

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

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

 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 ;

            }
        }


    }
}

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

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();
...