none
Consulta en WebApi Rest RRS feed

  • Pregunta

  • Buen día desarrolladores, tengo una duda.

    Me estoy basando en el siguiente tutorial para hacer una WebApi. Tutorial Web Api

    En el veo que hacen lo siguiente al inicial el Controller

    public class ProductsController : ApiController
        {
            Product[] products = new Product[] 
            { 
                new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, 
                new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
                new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
            };
    
            public IEnumerable<Product> GetAllProducts()
            {
                return products;
            }
    
            public IHttpActionResult GetProduct(int id)
            {
                var product = products.FirstOrDefault((p) => p.Id == id);
                if (product == null)
                {
                    return NotFound();
                }
                return Ok(product);
            }
        }

    Entonces mi duda esta.

    Lo que yo debería hacer es Siempre al iniciar la Clase llenar un Objeto con todos los datos?? Osea hacer un Select * y traerme todos los datos de la tabla y luego con los demás métodos consultar según lo que necesite?? Quiero usar buenas practicas por eso me baso en ese tutorial pero no entendí esa parte, agradezco me aclaren.

    lunes, 18 de julio de 2016 13:54

Respuestas

  • hola

    podrias crear una capa de datos que realice el SELECT usando ado.net

    analiza la capa de datos del ejemplo

    [ASP.NET] GridView – Edición Empleados

    veras como se utiliza la capa DAL para acceder a los datos, pero si vas a recuperar una unica entidad por el id no cargues la lista en memoria, deja que SQL se encargue de recuperar la entidad que quieres enviar

            public static EmpleadoEntity ObtenerById(int idEmpleado)
            {
                EmpleadoEntity empleado = null;
    
                using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
                {
                    conn.Open();
    
                    string query = @"SELECT IdEmpleado, Nombre, Apellido, FechaNacimiento, EstadoCivil, Imagen
                                     FROM Empleados WHERE IdEmpleado = @idEmpleado";
    
                    SqlCommand cmd = new SqlCommand(query, conn);
                    cmd.Parameters.AddWithValue("@idEmpleado", idEmpleado);
    
                    SqlDataReader reader = cmd.ExecuteReader();
    
                    if (reader.Read())
                    {
                        empleado = ConvertirEmpleado(reader, true);
                    }
    
                }
    
                return empleado;
            }

            private static EmpleadoEntity ConvertirEmpleado(IDataReader reader, bool cargarRelaciones)
            {
                EmpleadoEntity empleado = new EmpleadoEntity();
    
                empleado.IdEmpleado = Convert.ToInt32(reader["IdEmpleado"]);
                empleado.Nombre = Convert.ToString(reader["Nombre"]);
                empleado.Apellido = Convert.ToString(reader["Apellido"]);
                empleado.FechaNacimiento = Convert.ToDateTime(reader["FechaNacimiento"]);
                empleado.EstadoCivil = Convert.ToInt16(reader["EstadoCivil"]);
    
                return empleado;
            }

    como veras en el ejemplo la idea es que filtras por el id y devuelvas la entidad

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta CrissR martes, 19 de julio de 2016 0:11
    lunes, 18 de julio de 2016 14:26

Todas las respuestas

  • hola

    podrias crear una capa de datos que realice el SELECT usando ado.net

    analiza la capa de datos del ejemplo

    [ASP.NET] GridView – Edición Empleados

    veras como se utiliza la capa DAL para acceder a los datos, pero si vas a recuperar una unica entidad por el id no cargues la lista en memoria, deja que SQL se encargue de recuperar la entidad que quieres enviar

            public static EmpleadoEntity ObtenerById(int idEmpleado)
            {
                EmpleadoEntity empleado = null;
    
                using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
                {
                    conn.Open();
    
                    string query = @"SELECT IdEmpleado, Nombre, Apellido, FechaNacimiento, EstadoCivil, Imagen
                                     FROM Empleados WHERE IdEmpleado = @idEmpleado";
    
                    SqlCommand cmd = new SqlCommand(query, conn);
                    cmd.Parameters.AddWithValue("@idEmpleado", idEmpleado);
    
                    SqlDataReader reader = cmd.ExecuteReader();
    
                    if (reader.Read())
                    {
                        empleado = ConvertirEmpleado(reader, true);
                    }
    
                }
    
                return empleado;
            }

            private static EmpleadoEntity ConvertirEmpleado(IDataReader reader, bool cargarRelaciones)
            {
                EmpleadoEntity empleado = new EmpleadoEntity();
    
                empleado.IdEmpleado = Convert.ToInt32(reader["IdEmpleado"]);
                empleado.Nombre = Convert.ToString(reader["Nombre"]);
                empleado.Apellido = Convert.ToString(reader["Apellido"]);
                empleado.FechaNacimiento = Convert.ToDateTime(reader["FechaNacimiento"]);
                empleado.EstadoCivil = Convert.ToInt16(reader["EstadoCivil"]);
    
                return empleado;
            }

    como veras en el ejemplo la idea es que filtras por el id y devuelvas la entidad

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta CrissR martes, 19 de julio de 2016 0:11
    lunes, 18 de julio de 2016 14:26
  • Hola Leandro, Gracias por responder. Déjame ver si entendí bien.

    Lo que me indicas es que no lo haga como el ejemplo del tutorial que pongo donde dejan todo en memoria siempre si no que.

    1. Si voy a Consultar todos entonces en el metodo GetAll hago el Select * a la Base de datos usando Ado . Net
    2. Si voy a Consultar por ID 1 Registro, entonces en GetProduct hago nuevamente el Select a la Base de datos Usando Ado.Net pero busco por ID (No manejo anda en memoria siempre las consultas)
    3. Me nace una duda segun eso, Si por ejemplo quiero buscar por Empleado, entonces deberia crear un metodo mas abierto por ejemplo algo asi?
    public int ConsultaEmpleado(Empleado empleado)
    
    stringbuilder consulta = new stringbuilder();
    consulta.append = "select * from empleado where 1=1";
    
    if (!string.isnullorempty(empleado.nombre)
    {
      consulta.append(" and nombre like %@nombre%");
    }
    
    if(empleado.id>0)
    {
      consulta.append("and id = @id");
    }
    
    
    ......
    Te parece??

    lunes, 18 de julio de 2016 14:42