Запрос хранимой процедуры EF Core сопоставляется с типами - PullRequest
0 голосов
/ 29 октября 2018

У меня есть проект, который должен запросить базу данных и вернуть результаты в веб-API. Есть несколько хранимых процедур, которые создаются администратором БД на лету, и у них есть пользовательский интерфейс, который создает определение хранимой процедуры и ее имя, а служба веб-API просто вызывает этот SP и должна вернуть результат. Исходя из приведенного ниже кода, я не могу получить возвращаемый объект в контроллер веб-API, так как объект содержит элементы, но свойства не сопоставлены.

var result = dbContext.Query<object>().AsNoTracking().FromSql(
            "dbo.MY_SP @DateFrom=@DateFrom, @DateTo=@DateTo",
            dateFromParam, dateToParam).ToList();

1 Ответ

0 голосов
/ 30 октября 2018

В вашем случае вам нужно использовать динамический для представления результата хранимой процедуры.

Добавьте следующий метод в ваш класс DbContext:

public IEnumerable<dynamic> GetDynamicResult(string commandText, params SqlParameter[] parameters)
{
    // Get the connection from DbContext
    var connection = DbContext.Database.GetDbConnection();

    // Open the connection if isn't open
    if (connection.State != System.Data.ConnectionState.Open)
        connection.Open();

    using (var command = connection.CreateCommand())
    {
        command.CommandText = commandText;
        command.Connection = connection;

        if (parameters?.Length > 0)
        {
            foreach (var parameter in parameters)
            {
                command.Parameters.Add(parameter);
            }
        }

        using (var dataReader = command.ExecuteReader())
        {
            // List for column names
            var names = new List<string>();

            if (dataReader.HasRows)
            {
                // Add column names to list
                for (var i = 0; i < dataReader.VisibleFieldCount; i++)
                {
                    names.Add(dataReader.GetName(i));
                }

                while (dataReader.Read())
                {
                    // Create the dynamic result for each row
                    var result = new ExpandoObject() as IDictionary<string, object>;

                    foreach (var name in names)
                    {
                        // Add key-value pair
                        // key = column name
                        // value = column value
                        result.Add(name, dataReader[name]);
                    }

                    yield return result;
                }
            }
        }
    }
}

Теперь вы можете вызывать хранимую процедуру следующим образом:

var result = dbContext.GetDynamicResult(" exec [dbo].[MySp] @dateFrom, @dateTo ", new SqlParameter("@dateFrom", dateFrom), new SqlParameter("@dateTo", dateTo));

Пожалуйста, дайте мне знать, если этот ответ полезен.

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...