Возврат объекта данных с использованием Entity Framework путем выполнения хранимой процедуры

#entity-framework #stored-procedures #dynamic #dynamic-tables

#entity-framework #хранимые процедуры #динамический #динамические таблицы

Вопрос:

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

 IList<SqlParameter> parameters = GetCashInItemsParameters("inv.uspMonthendProces");
string queryString = CreateStoredProcedureExecuteQuery("inv.uspMonthendProcess", parameters);
var tempResult = ExecuteStoredProcedureForDataRetrieve<dynamic>(queryString, parameters.ToArray()).ToList();
  

CreateStoredProcedureExecuteQuery

 public static string CreateStoredProcedureExecuteQuery(string storedProcedureName, IList<SqlParameter> parameters)
{
            string result = string.Empty;
            string parameterString = string.Join(
                ",", parameters.Select(i => i.ParameterName));
            result = string.Format(
                "{0} {1}", storedProcedureName, parameterString);

            return result;
}
  

CreateParameter

 public static SqlParameter CreateParameter(string parameterName, object value, SqlDbType dbType)
        {
            SqlParameter param = new SqlParameter(parameterName, dbType);
            param.Value = value;
            param.Value = value ?? (object)DBNull.Value;
            return param;
        }
  

GetCashInItemsParameters

 public static IList<SqlParameter> GetCashInItemsParameters(string storedProcedureName)
        {
            IList<SqlParameter> parameters = new List<SqlParameter>();
            try
            {
                parameters.Add(CreateParameter(
                    "@Year", 2019, SqlDbType.Int));
                parameters.Add(CreateParameter(
                    "@Month", 3, SqlDbType.Int));
                parameters.Add(CreateParameter(
                    "@FromDate", "2019-03-01", SqlDbType.Date));

                parameters.Add(CreateParameter(
                    "@ToDate", "2019-03-31", SqlDbType.Date));
                parameters.Add(CreateParameter(
                    "@CashCentreId",1, SqlDbType.Int));
                parameters.Add(CreateParameter(
                    "@CustomerId", 2, SqlDbType.Int));
                parameters.Add(CreateParameter(
                    "@CurrencyId", 1, SqlDbType.Int));

            }
            catch (Exception ex)
            {
            }

            return parameters;
        }
  

ExecuteStoredProcedureForDataRetrieve

 public IList<T> ExecuteStoredProcedureForDataRetrieve<T>(string sqlQuery, params object[] parameters) where T : class
        {
            return db.Database.SqlQuery<T>(sqlQuery, parameters).ToList();
        }
  

Это то, что я получаю в результате

введите описание изображения здесь

Я пробовал с object , DataTable DataSet . Но это тоже не сработало. Проект, над которым я работаю, использует репозиторий. Поэтому невозможно использовать традиционную ADO.net

Ответ №1:

Три вещи:

  1. Вы неправильно написали inv.uspMonthendProces

  2. Вы выводите параметр, а не parameter.value для результатов.

  3. Столбец, к которому принадлежит параметр, не идентифицирован.

https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparameter

SqlParameter(строка, SqlDbType, Int32, String) Инициализирует новый экземпляр класса SqlParameter, который использует имя параметра, SqlDbType, размер и имя исходного столбца.