CodeFirst


public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
}

public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
}
public class SchoolContext : DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=.\SQLEXPRESS;Database=pasiona;Trusted_Connection=True;");
}
}

Más LINQ

Con la clase Alumno

 class Alumno
{
public string Nombre { get; set; }
public int Edad { get; set; }
public double Nota { get; set; }
public Alumno(string nombre, int edad, double nota)
{
Nombre = nombre;
Edad = edad;
Nota = nota;
}
public override string ToString()
{
return Nombre+" - "+Edad+" - "+Nota;
}
}

(https://github.com/juanpablofuentes/CSharp/blob/master/LINQ/LinqBasico/LinqBasico/Alumno.cs) y los siguientes datos:


List<Alumno> listaAlumnos = new List<Alumno>()
{
new Alumno("Eva",20,6.0),
new Alumno("Ana",22,7.0),
new Alumno("Rosa",22,4.0),
new Alumno("Ot",20,3.0),
new Alumno("Iu",30,6.8),
new Alumno("Pep",32,5.9),
new Alumno("Laia",30,2.3),
new Alumno("Quim",32,1.7),
};

Crear las consultas LINQ y mostrar los datos para obtener lo siguiente:

1.- Agrupar los alumnos por edad y mostrarlos con el formato: Edad: XX, alumnos: (nombre de los alumnos)

2.- Agrupar los alumnos por aprobado/suspendido y mostrarlos con el mismo formato de antes

3.- Agrupar los alumnos por década (los de 20, los de 30…) y mostrarlos.

Tenemos la siguiente clase:


class Descuento{

public string Nombre { get; set; }

public int Decada{ get; set; }

public Descuento(string nombre, int decada) { Nombre = nombre; Decada= decada;  } public override string ToString() { return Nombre+" - "+Decada; } }

 List<Descuento> listaDescuentos = new List<Descuento>() { 
new Descuento("Jovenes",20), 
new Descuento("Profesionales",30), 
new Descuento("Tercera edad",60)
 }; 

Con estos datos haced un join entre los descuentos y los alumnos y un groupjoin para que salgan todos los descuentos.

Ejercicio Linq funciones

Vamos a crear un juego de torretas y vamos a crear la clase Torreta que tiene como propiedades:

Nombre

Posicion(x,y) struct con propiedades x e y

Rango (int)

Ataque(int)

Sería conveniente, a efectos de lo que vamos a hacer después, sobreescribir los métodos toString() Equals() y getHashCode()

Vamos a crear una lista de torretas que van a abarcar un terreno de 400×400. Tendremos un cuadrado de 4×4 torretas colocadas en las posiciones

(50,50) (150,50) (250,50)(350,50)

(50,150) (150,150) (250,150)(350,150)

(50,250) (150,250) (250,250)(350,250)

(50,350) (150,350) (250,350)(350,350)

El nombre será correlativo (Torreta1,Torreta2,…) el rango de todas es de 100 y el ataque es la suma de las coordenadas dividido por 10.

A partir de aquí:

Mostrar todas las torretas que tienen potencia de ataque superior a 50

Mostrar todas las torretas que tienen potencia de ataque superior a 50 en la primera fila

Mostrar las torretas ordenadas por ataque y después por la posición x (primera coordenada).

¿Cual es la media de ataque de todas las torretas?

¿Cual es la torreta de menos ataque?

¿Hay alguna torreta que tenga una potencia de ataque mayor de 60? (Si o no, no buscarla)

Mostrar las torretas que puedan atacar a la posición (200,200). Calcular la potencia de ataque que converge en ese punto.

Ejercicio LINQ

Con la clase Alumno

 class Alumno
{
public string Nombre { get; set; }
public int Edad { get; set; }
public double Nota { get; set; }
public Alumno(string nombre, int edad, double nota)
{
Nombre = nombre;
Edad = edad;
Nota = nota;
}
public override string ToString()
{
return Nombre+" - "+Edad+" - "+Nota;
}
}

(https://github.com/juanpablofuentes/CSharp/blob/master/LINQ/LinqBasico/LinqBasico/Alumno.cs) y los siguientes datos:


List<Alumno> listaAlumnos = new List<Alumno>()
{
new Alumno("Eva",20,6.0),
new Alumno("Ana",22,7.0),
new Alumno("Rosa",22,4.0),
new Alumno("Ot",20,3.0),
new Alumno("Iu",30,6.8),
new Alumno("Pep",32,5.9),
new Alumno("Laia",30,2.3),
new Alumno("Quim",32,1.7),
};

Crear las consultas LINQ y mostrar los datos para obtener lo siguiente:

1.- Alumnos que han aprobado mayores de 30 años.

2.- Alumno con la mejor nota

3.- Alumno más joven

4.- Media de nota del grupo

5.- Media de edad de los aprobados

 

LINQ

Una consulta es una expresión que recupera datos de un origen de datos. Las consultas se suelen expresar en un lenguaje de consultas especializado. Con el tiempo se han desarrollado diferentes lenguajes para los distintos tipos de orígenes de datos, como SQL para las bases de datos relacionales y XQuery para XML. Por lo tanto, los programadores han tenido que aprender un lenguaje de consultas nuevo para cada tipo de origen de datos o formato de datos que deben admitir. LINQ simplifica esta situación al ofrecer un modelo coherente para trabajar con los datos de varios formatos y orígenes.

https://docs.microsoft.com/es-es/dotnet/csharp/programming-guide/concepts/linq/introduction-to-linq-queries

https://www.tutorialsteacher.com/linq/what-is-linq

https://www.campusmvp.es/recursos/post/introduccion-rapida-a-linq-con-c-sharp.aspx

https://linqsamples.com/

Ejercicio eventos

Vamos a crear  una clase CuentaCorriente con un saldo privado de tipo moneda. Creamos una propiedad pública para este saldo .

Tendrá una propiedad publica credito de tipo moneda.

Creamos un delegado que no devuelve nada y tiene un parámetro moneda.

Creamos dos eventos: limite y descubierto.

En el setter del saldo si el saldo es menor o igual que el crédito se lanza el evento limite.

Si el saldo es menor que cero lanzamos el evento descubierto (y no el del límite)

Creamos una cuenta en el program y comprobamos que funcione.

Eventos

Cuando ocurre algo interesante, los eventos habilitan una clase u objeto para notificarlo a otras clases u objetos. La clase que envía (o genera) el evento recibe el nombre de publicador y las clases que reciben (o controlan) el evento se denominan suscriptores.

En una aplicación web o una aplicación de Windows Forms en C# típica, se puede suscribir a eventos generados por controles, como botones y cuadros de lista.

https://docs.microsoft.com/es-es/dotnet/csharp/programming-guide/events/

https://www.tutorialsteacher.com/csharp/csharp-event

Events in C#