MVC + Consultas

Vamos a crear un controlador ConsultasController sobre la escuela. Tendrá las siguientes acciones:

Cursos

Nos mostrará la lista de cursos que tengan alumnos matriculados

Alumnos

Nos mostrará la lista de alumnos que estén matriculados en más de un curso

Direcciones
Nos mostrará la lista de alumnos que tengan más de una dirección

TotalPorCiudad
Nos mostrará el número de direcciones que tiene cada ciudad. Aquí tenemos una cadena y un número ¿Cómo lo haremos?

AlumnosCiudad
Nos mostrará los alumnos que sean de la ciudad que tiene más direcciones.

Como conectar

En program.cs

            // Add services to the container.
            builder.Services.AddControllersWithViews();
            // Añadimos la conexión al contexto
            builder.Services.AddDbContext<Contexto>(options =>
options.UseSqlServer("Data Source=.\\SQLEXPRESS;Initial Catalog=clase;Integrated Security=True;TrustServerCertificate=True"));
            var app = builder.Build();

En contexto.cs:

 public DbSet<Alumno> Alumnos { get; set; }
 public Contexto(DbContextOptions<Contexto> options) : base(options)
 {
 }

Pistas Poker

Poker

Pareja
trio
color
full
poker
escalera
ecalera de color

1.- Cuantas cartas repetidas tengo
(lo del diccionario del mus)
Si hay cinco unos (5 elementos)
SI hay un 2 y tres unos: pareja (4 elementos)
Si tengo dos 2 y un 1: Doble pareja (3 elementos)
SI tengo un 3 y dos 1: trío (3 elementos)
Si tengo un 4 y un 1: poker (2 elementos)

<2,3><7,2>
<5,3><1,2>

Crearía una función a la que le paso una mano y me devuelve el diccionario

2.- Color: son todas del mismo palo o no
Aprovechar el algoritmo del diccionario para que me agrupe por palo y no por valor
CUando el diccionario solo tenga un elemento tengo color

otro: cojo el palo de la primera carta y hago un bucle. Si alguna carta tiene un palo diferente devuelvo false

Crearía un función a la que le paso una mano y me devuelve true o false

3.- Escalera
Las cartas son consecutivas
Ordenar la mano (de menor a mayor)
Si cada carta es igual a la anterior +1 hay escalera, si no, no

Crearía una función a la que le paso una mano y me dice true o false si hay escalera o no

Cada cosa la probamos, y la probamos con datos creados por nosotros

 

Ejercicios sobre escuela

Insertad 10 alumnos llamados alumno1, alumno2…alumno10, con direcciones iguales (calle1 ciudad1,…) matriculados en cursos iguales (curso1,…)

Mostrad los cursos de los alumnos que tengan un ‘1’ en el nombre.

Matriculad a todos los alumnos en el curso de id ‘1’

Mostrad el total de alumnos matriculados por cada curso (nombre del curso y total alumnos).

Ordenadlo de mayor a menor.

Eliminad todas las matrículas del curso9.

Ejercicio EFCore

Cread las entidades en c# necesarias para implementar la siguiente base de datos:

Se desea crear una base de datos que contenga información sobre las revistas a las que estás suscrito o compras habitualmente. De cada revista, se pide su título, el ISSN (un código que identifica a la publicación), el número y el año de publicación. También se desea almacenar información de cada uno de los artículos publicados: el título, la página de inicio y la página de fin. Se asume que no hay dos artículos con el mismo título.

Cada artículo puede estar escrito por varios autores, de quienes interesa conocer su nombre, una dirección de correo electrónico y su país de nacimiento.

REVISTA     ARTÍCULO  AUTOR

Revista(1)—(N)Artículo(N)—(N)Autor

Revista: título, ISSN, número, año publicacion

Artículo: título, página inicio y fin

Autor: Nombre, email, país nacimiento

Autor-Artículo:

 

dotnet add package Microsoft.EntityFrameworkCore

dotnet add package Microsoft.EntityFrameworkCore.SqlServer # Para SQL Server dotnet add package Microsoft.EntityFrameworkCore.Tools

Prueba One to Many y Many to Many

Tenemos la tabla ‘Provincias’ con id y nombre
Y la tabla relacionada ‘Ciudades’ con id y nombre también.
Una provincia tiene varias y ciudades y una ciudad una sola provincia.

Añadimos la tabla cliente con id y nombre

Y una relación Many to Many entre cliente y ciudad

Mini ejercicio CodeFirst

Una empresa nos pide que creemos una BD para controlar su inventario. Tienen un almacen con una serie de productos de los que les interesa saber el nombre y la cantidad que tienen (p. ej. tuercas, 20).
Los productos se los compran a unos proveedores y quieren saber el nombre y el telefono de los mismos para que cuando necesiten renovar stock les puedan llamar.

El modelo E/R para esta base de datos es el siguiente:

Cread la BD, el contexto necesario, y las dos entidades. De momento no implementamos la relación. Lo haremos mañana.

Práctica migraciones

Añadimos un campo ‘Raza’ de tipo String a Pajaro
Añadimos la Entidad ‘Jaula’ con Id, Nombre, Ancho,Alto,Largo de tipo int y Precio de tipo Decimal

Añadimos la migracion ‘raza’ cuando añadimos el campo raza
Y la migración Jaula cuando añadimos la entidad jaula

Después actualizamos la base de datos.

Código DAO

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;

namespace DAOAcademia
{

    internal class DAOAlumno:IDAO<Alumno>
    {
        SqlConnection conn;
        public DAOAlumno() {
            conn=Conexion.getConn();
        }

        public int Delete(int id)
        {
            try
            {
                conn.Open();
                String sql = "delete alumno where id=@id";
                SqlCommand comando = new SqlCommand(sql, conn);
                comando.Parameters.AddWithValue("@id", id);

                int res = comando.ExecuteNonQuery();

                conn.Close();
                return res;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return 0;
            }
        }

        public List<Alumno> GetAll()
        {
            try
            {
                conn.Open();
                String sql = "select * from alumno";
                SqlCommand lectura = new SqlCommand(sql, conn);
                SqlDataReader sqlDataReader = lectura.ExecuteReader();
                List<Alumno> alumnos= new List<Alumno>();
                while (sqlDataReader.Read())
                {
                    Alumno alumno = new Alumno(sqlDataReader.GetInt32(0),
                        sqlDataReader.GetString(1) ?? "",
                        sqlDataReader.GetString(2)??"",
                        sqlDataReader.GetString(3)??""
                        );
                    alumnos.Add( alumno );
                }
                conn.Close();
                return alumnos;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }

        public Alumno GetById(int id)
        {
            Alumno alumno = null;
            try
            {
                conn.Open();
                String sql = "select *from alumno where id=@id";
                SqlCommand lectura = new SqlCommand(sql, conn);
                lectura.Parameters.AddWithValue("@id", id);
                SqlDataReader sqlDataReader = lectura.ExecuteReader();
                
                if (sqlDataReader.Read())
                {
                    alumno = new Alumno(sqlDataReader.GetInt32(0),
                        sqlDataReader[1] as string ??"",
                        sqlDataReader.GetString(2) ?? "",
                        sqlDataReader.GetString(3) ?? ""
                        );
                    
                }
                conn.Close();
                return alumno;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return alumno;
            }
        }

        public int Insert(Alumno alumno)
        {
            
            try
            {
                conn.Open();
                String sql = "insert into alumno (nombre,dni,email) values (@nombre,@dni,@email)";
                SqlCommand comando = new SqlCommand(sql, conn);
                comando.Parameters.AddWithValue("@nombre", alumno.Nombre);
                comando.Parameters.AddWithValue("@dni", alumno.DNI);
                comando.Parameters.AddWithValue("@email", alumno.Email);
                
                int res = comando.ExecuteNonQuery();

                conn.Close();
                return res;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return 0;
            }
        }

        public int Save(Alumno alumno)
        {
            if (alumno.Id == 0)
            {
                return Insert(alumno);
            }
            else
            {
                return Update(alumno);
            }
        }

        public int Update(Alumno alumno)
        {
            try
            {
                conn.Open();
                String sql = "update alumno set nombre=@nombre,dni=@dni,email=@email where id=@id";
                SqlCommand comando = new SqlCommand(sql, conn);
                comando.Parameters.AddWithValue("@nombre", alumno.Nombre);
                comando.Parameters.AddWithValue("@dni", alumno.DNI);
                comando.Parameters.AddWithValue("@email", alumno.Email);
                comando.Parameters.AddWithValue("@id", alumno.Id);

                int res = comando.ExecuteNonQuery();

                conn.Close();
                return res;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return 0;
            }
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAOAcademia
{
    internal interface IDAO<T>
    {
        List<T> GetAll();
        T GetById(int id);
        int Insert(T entity);
        int Update(T entity);
        int Save(T entity);
        int Delete(int id);
    }
}

using System;
using System.Collections.Generic;
using Microsoft.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAOAcademia
{
internal class Conexion
{
public static SqlConnection getConn()
{
var connection = new SqlConnection();
connection.ConnectionString = “Data Source=.\\SQLEXPRESS;” +
“Initial Catalog=pasiona;Integrated Security=True;” +
“TrustServerCertificate=True”;
return connection;
}
}
}
]/c]

Primeros pasos DAO

 class Alumno
    {
        public int Id { get; set; }
        public string Nombre { get; set; }
        public string DNI { get; set; }
        public string Email { get; set; }

        public Alumno(int id, string nombre, string dni, string email)
        {
            Id = id;
            Nombre = nombre;
            DNI = dni;
            Email = email;
        }
        public override string ToString()
        {
            return Id+" - "+Nombre+" - "+DNI+" - "+Email;
        }
    }
 internal class DAOAlumno
    {
        public DAOAlumno() { }
        public List<Alumno> getAll()
        {
            var connection = new SqlConnection();
            connection.ConnectionString = "Data Source=.\\SQLEXPRESS;" +
                "Initial Catalog=pasiona;Integrated Security=True;" +
                "TrustServerCertificate=True";
            connection.Open();
            String sql = "select * from alumno";
            SqlCommand lectura = new SqlCommand(sql, connection);
            SqlDataReader sqlDataReader = lectura.ExecuteReader();
            List<Alumno> alumnos=new List<Alumno>();
            while (sqlDataReader.Read())
            {
                Alumno temp = new Alumno(sqlDataReader.GetInt32(0),
                    sqlDataReader.GetString(1),
                    sqlDataReader.GetString(2),
                    sqlDataReader.GetString(3));
                alumnos.Add(temp); 
            }

            sqlDataReader.Close();
            connection.Close();
            return alumnos;
        }
    }
  DAOAlumno dao=new DAOAlumno();
            List<Alumno> clase = dao.getAll();
            Console.WriteLine(String.Join(" | ",clase));