Как получить все значения поля с помощью entities.База данных.SqlQuery?

#asp.net-mvc #api

#asp.net-mvc #API

Вопрос:

У меня есть хранимая процедура, которая может возвращать более одного значения поля.

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

Мне нужно создать API , который получит все значения одного и того же поля.

Мой контроллер имеет следующий код:

 public partial class get_active_call_info_id_Result
    {
        public int call_info_id { get; set; }
    }

public partial class error_message
        {
            public int StatusCode { get; set; }
        }

[BasicAuthentication]
        [Route("getactivecallinfoid")]
        [HttpPost, ActionName("getactivecallinfoid")]
        public System.Web.Http.Results.JsonResult<String> GetACII(String u_id)
        {
            //var data = (dynamic)null;
            using (EMSMVCEntities entities = new EMSMVCEntities())
            {
                String jsonResult = null;
                String jsonResult_log = null;

                entities.Configuration.ProxyCreationEnabled = false;
                var query = entities.Database.SqlQuery<get_active_call_info_id_Result>("exec [dbo].[get_active_call_info_id] @user_id", new SqlParameter("user_id", u_id))
                    .Select(x => new
                    {   
                        x.call_info_id,
                        StatusCode = 1 //Success StatusCode
                    }).ToList();

                bool isEmpty = !query.Any();
                if (isEmpty)
                {
                    error_message error_status = new error_message()
                    {
                        StatusCode = 0
                    };

                    jsonResult = JsonConvert.SerializeObject(error_status);
                  
                }
                else
                {
                    jsonResult = JsonConvert.SerializeObject(query[0]); // <-- using Newtonsoft.Json
                   
                }

                return Json(jsonResult);
            }
        }
  

Результат, который я получаю, вызывая этот API через POSTMAN , таков:

 "{"call_info_id":3,"StatusCode":1}"
  

Правильный должен быть чем-то вроде:

 "{"call_info_id":3, "call_info_id":4,"StatusCode":1}"
  

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

1. вы сериализуете только первый элемент в массиве — вместо запроса [0] просто сериализуйте запрос, и в итоге вы должны получить что-то вроде "[{"call_info_id":3}, {"call_info_id":4}] ,"StatusCode":1}"

2. @Carl Не могли бы вы также рассказать мне, пожалуйста, как убрать квадратные скобки в этом?

3. Квадратные скобки обозначают список объектов, это синтаксис JSON. если вам нужен плоский объект, создайте класс с несколькими свойствами, например callinfoId1, callinfoId2 и т.д., И сериализуйте это. но это может быть неприятно, если вы не знаете, сколько значений вы могли бы получить

Ответ №1:

Я нашел решение, используя dictionary :

 [BasicAuthentication]
[Route("getactivecallinfoid")]
[HttpPost, ActionName("getactivecallinfoid")]
public System.Web.Http.Results.JsonResult<String> GetACII(String u_id)
        {
            using (EMSMVCEntities entities = new EMSMVCEntities())
            {
                String jsonResult = null;
                String jsonResult_log = null;

                entities.Configuration.ProxyCreationEnabled = false;
                   
                var query_pre = entities.Database.SqlQuery<get_active_call_info_id_Result>("exec [dbo].[get_active_call_info_id] @user_id", new SqlParameter("user_id", u_id))
                    .ToList();

                var query = new Dictionary<String, String>();
                int counter = 1;
                foreach (var item in query_pre)
                { 
                    query.Add("call_info_id_" counter.ToString(), item.call_info_id.ToString());
                    counter  = counter;
                };
                query.Add("StatusCode","1");
                bool isEmpty = !query.Any();
                if (isEmpty)
                {
                    error_message error_status = new error_message()
                    {
                        StatusCode = 0
                    };

                    jsonResult = JsonConvert.SerializeObject(error_status);
                }
                else
                {
                    jsonResult = JsonConvert.SerializeObject(query); // <-- using Newtonsoft.Json
                }

                return Json(jsonResult);
            }
        }