У меня есть пользовательские данные, которые возвращаются из хранимой процедуры, поэтому мне нужно добавить эти данные в list и вернуть в asp.net основной веб-api c#

#c# #asp.net-core

#c# #asp.net-ядро

Вопрос:

Вот мой пример кода:

  using (IDbConnection con = new SqlConnection(Constants.DefaultConnectionString))
 {
      if (con.State == ConnectionState.Closed)
          con.Open();

      DynamicParameters parameter = new DynamicParameters();
      parameter.Add("@StandardObjectName", StandardObject);
      parameter.Add("@UserID", UserID);

      var AccountRecord = await con.QueryAsync<GetCustomDataForStandardObject>(
           StoredProcedure.GetCustomobjectDataForStandardObject, parameter, 
           commandType: CommandType.StoredProcedure);

      var mapResult = Common.AutoMapper.MapListData<GetCustomDataForStandardObject, 
           GetStandardBYName>(AccountRecord.ToList());

      List<string> CustomData = new List<string>();
      GetCustomObjectLinkData Data = null;

      // DataTable dt = new DataTable();
      // LeadRecord.ToList();

      for (int a = 0; a < mapResult.Count; a  )
      {
           int customobjectid = 0;
           customobjectid = mapResult[a].CustomObjectID;
           DynamicParameters pa = new DynamicParameters();
           pa.Add("@CustomObjectSchemaId", customobjectid);
           var rowAffected = await con.QueryAsync(StoredProcedure.GetCustomObjectData, 
               pa, commandType: CommandType.StoredProcedure);
           rowAffected.ToList();
      }
}
 

У меня есть несколько строк данных для нескольких customobjectid, и мне нужно добавить эти данные в массив или список. Кто-нибудь может мне помочь, пожалуйста?

Комментарии:

1. К вашему сведению, .ToList() возвращает коллекцию в виде нового списка. Я вижу, что вы вызываете этот метод, но ничего не делаете с возвращаемым значением, поэтому он ничего не делает. Если вы хотите rowAffected быть списком, тогда вы должны сделать: var rowAffected = await con.QueryAsync(argsHere).ToList();

2. Кроме того, rowAffected объявляется внутри for цикла, поэтому его область действия ограничена циклом, и поскольку он никогда не используется, for цикл ничего не делает.

3. Не "object" "GetCustomobjectDataForStandardObject" должно быть "Object" ? Не уверен, просто читал код.

Ответ №1:

Это просто выстрел в темноте, основанный на вашем примере кода, поскольку я ничего не знаю о dapper (я предполагаю, что это dapper? Если да, пожалуйста, добавьте Dapper тег к вашему вопросу), но посмотрите, приблизит ли вас что-то подобное к тому, что вы хотите.

Я использую ToList() при вызове to QueryAsync , поэтому для каждого result mapResult List<rowData> входа возвращается новый. Затем вызов .ToList() .Select оператора возвращает результат в виде a List<List<rowData>> , где каждый внутренний список представляет собой строку значений, а внешний список представляет собой список строк.

Приведенный ниже код заменит ваш for цикл:

 var rowsAffected = mapResult.Select(result =>
    {
        DynamicParameters pa = new DynamicParameters();
        pa.Add("@CustomObjectSchemaId", result.CustomObjectID);
        return await con.QueryAsync(StoredProcedure.GetCustomObjectData, 
            pa, commandType: CommandType.StoredProcedure).ToList();
    }).ToList();

// rowsAffected is a List<List<rowData>>, where the outer list contains all the rows
// and each inner list is the row data for a specific row
 

Комментарии:

1. Dapper использует в моем пространстве имен reference.dapper, используемый для dynamicparameters.mapresult, имеет все идентификаторы, поэтому я объявил цикл для mapresult и передал customobjectid один за другим в мою процедуру и получил данные, сохраненные в rowaffected var.so мне нужно прочитать значения var и сохраненные данные в списке, если цикл не остановлен.

2. ОК. Подходит ли вам этот пример? Я не могу сказать из вашего комментария. Добавление dapper тега к вашему вопросу привлечет больше экспертов.