/// <summary> /// Linq to entities min max e avg /// calcular o "preço da maior", "menor venda" e "venda média". /// </summary> private static void Aula12() { using (var contexto = new TunesEntities()) { //para ver as consultas que estão sendo geradas contexto.Database.Log = Console.WriteLine; //faz 3 chamadas no banco var maiorVenda = contexto.NotaFiscals.Max(nf => nf.Total); var menorVenda = contexto.NotaFiscals.Min(nf => nf.Total); var mediaVenda = contexto.NotaFiscals.Average(nf => nf.Total); Console.WriteLine("A maior venda é de R$ {0}", maiorVenda); Console.WriteLine("A menor venda é de R$ {0}", menorVenda); Console.WriteLine("A media venda é de R$ {0}", mediaVenda); //para trazer todas as consultas de uma vez //o single transforma a consulta em um objeto var vendas = (from nf in contexto.NotaFiscals group nf by 1 into agrupado select new { MaiorVenda = agrupado.Max(nf => nf.Total), MenorVenda = agrupado.Min(nf => nf.Total), VendaMedia = agrupado.Average(nf => nf.Total) }).Single(); Console.WriteLine("A maior venda é de R$ {0}", vendas.MaiorVenda); Console.WriteLine("A menor venda é de R$ {0}", vendas.MenorVenda); Console.WriteLine("A media venda é de R$ {0}", vendas.VendaMedia); } Console.ReadKey(); }
/// <summary> /// Linq to entities com count /// </summary> private static void Aula9() { using (var contexto = new TunesEntities()) { var query = from f in contexto.Faixas where f.Album.Artista.Nome == "Led Zeppelin" select f; //quantas faixas existem em um album //var quantidade = query.Count(); var quantidade = contexto.Faixas.Count(f => f.Album.Artista.Nome == "Led Zeppelin"); Console.WriteLine(quantidade); //foreach (var item in query) //{ // Console.WriteLine("{0}\t", item.Nome); //} Console.WriteLine(); Console.ReadKey(); } }
/// <summary> /// Linq to entities - Where com Lambda /// </summary> private static void Aula5() { using (var contexto = new TunesEntities()) { string textoBusca = "Led"; //sintaxe de consulta //usada para consultas mais complexas var query = from a in contexto.Artistas where a.Nome.Contains(textoBusca) select a; foreach (var item in query) { Console.WriteLine("{0}\t{1}", item.ArtistaId, item.Nome); } //sintaxe de metodo //select esta implicito //usada mais para consultas simples var query2 = contexto.Artistas.Where(a => a.Nome.Contains(textoBusca)); Console.WriteLine(); foreach (var item in query2) { Console.WriteLine("{0}\t{1}", item.ArtistaId, item.Nome); } Console.ReadKey(); } }
/// <summary> /// Select com join - Linq to entities /// </summary> private static void Aula4() { using (var contexto = new TunesEntities()) { var query = from g in contexto.Generos select g; //trouxe muitos dados var queryFaixaGenero = from g in contexto.Generos join f in contexto.Faixas on g.GeneroId equals f.GeneroId select new { g, f }; //traz somente 10 elementos queryFaixaGenero = queryFaixaGenero.Take(10); //configuração para ver tudo que é gerado no link para o sql contexto.Database.Log = Console.WriteLine; foreach (var item in queryFaixaGenero) { Console.WriteLine("{0}\t{1}", item.f.Nome, item.g.Nome); } Console.ReadKey(); } }
/// <summary> /// Linq to entities - Refinando Consultas com parametros /// </summary> private static void Aula7() { string textoBusca = "Led Zeppelin"; string textoBuscaAlbum = "Graffiti"; using (var contexto = new TunesEntities()) { GetFaixas(textoBusca, contexto, textoBuscaAlbum); Console.ReadKey(); } }
/// <summary> /// Linq to entites - Join /// </summary> private static void Aula6() { using (var contexto = new TunesEntities()) { string textoBusca = "Led"; //usando consulta com join para casos em que não é possivel ler //as propriedades de navegação e onde não existe o relacionamento //pela chave que esta sendo comparada var query = from a in contexto.Artistas join alb in contexto.Albums on a.ArtistaId equals alb.ArtistaId where a.Nome.Contains(textoBusca) select new { NomeArtista = a.Nome, NomeAlbum = alb.Titulo }; foreach (var item in query) { Console.WriteLine("{0}\t{1}", item.NomeArtista, item.NomeAlbum); } Console.WriteLine(); //consulta sem join usando navigation properties //consulta mais limpa, podemos usar sem o join encadeando as propriedades de navegação var query2 = from alb in contexto.Albums where alb.Artista.Nome.Contains(textoBusca) select new { NomeArtista = alb.Artista.Nome, NomeAlbum = alb.Titulo }; foreach (var item in query2) { Console.WriteLine("{0}\t{1}", item.NomeArtista, item.NomeAlbum); } Console.ReadKey(); } }
/// <summary> /// Linq to entities com Sum /// </summary> private static void Aula10() { using (var contexto = new TunesEntities()) { //calcular total de vendas por artista var query = from inf in contexto.ItemNotaFiscal where inf.Faixa.Album.Artista.Nome.Contains("Led Zeppelin") select new { totalItem = inf.Quantidade * inf.PrecoUnitario }; //preciso pegar o que retorna da query acima e somar var totalDoArtista = query.Sum(q => q.totalItem); Console.WriteLine(totalDoArtista); Console.ReadKey(); } }
/// <summary> /// Linq to entities groupby /// criar um relatório para listar os álbuns mais vendidos de um artista /// </summary> private static void Aula11() { using (var contexto = new TunesEntities()) { var query = from inf in contexto.ItemNotaFiscal where inf.Faixa.Album.Artista.Nome == "Led Zeppelin" group inf by inf.Faixa.Album into agrupado //aqui temos repetição da logica de soma então precisamos criar uma variavel //variavel dentro de uma consulta linq - let(variavel interna dentro da consulta linq orderby agrupado.Sum(a => a.Quantidade *a.PrecoUnitario) descending select new { TituloAlbum = agrupado.Key.Titulo, TotalPorAlbum = agrupado.Sum(q => q.Quantidade * q.PrecoUnitario) }; //com let var query2 = from inf in contexto.ItemNotaFiscal where inf.Faixa.Album.Artista.Nome == "Led Zeppelin" group inf by inf.Faixa.Album into agrupado //aqui temos repetição da logica de soma então precisamos criar uma variavel //variavel dentro de uma consulta linq - let(variavel interna dentro da consulta linq let vendaPorAlbum = agrupado.Sum(q => q.Quantidade * q.PrecoUnitario) orderby vendaPorAlbum descending select new { TituloAlbum = agrupado.Key.Titulo, TotalPorAlbum = vendaPorAlbum }; foreach (var item in query) { Console.WriteLine("{0}\t{1}", item.TituloAlbum.PadRight(40), item.TotalPorAlbum ); } Console.ReadKey(); } }
/// <summary> /// Linq métodos extensão /// cliente requisitou o cálculo da mediana das vendas. /// </summary> private static void Aula13() { using (var contexto = new TunesEntities()) { var vendaMedia = contexto.NotaFiscals.Average(nf => nf.Total); Console.WriteLine("Venda Media {0}", vendaMedia); //para não usarmos dessa forma vamos criar um metodo de extensão var query = from nf in contexto.NotaFiscals select nf.Total; //usando o metodo de extensão criado var vendaMediana = contexto.NotaFiscals.Mediana(nf => nf.Total); Console.WriteLine("Mediana {0}", vendaMediana); Console.ReadKey(); } }
private static void GetFaixas(string textoBusca, TunesEntities contexto, string buscaAlbum) { var query = from f in contexto.Faixas where f.Album.Artista.Nome.Contains(textoBusca) && (!string.IsNullOrEmpty(buscaAlbum) ? f.Album.Titulo.Contains(buscaAlbum) : true) orderby f.Album.Titulo, f.Nome select f; //if(!string.IsNullOrEmpty(buscaAlbum)) //{ // query = query.Where(a => a.Album.Titulo.Contains(buscaAlbum)); //} //aula 8 - thenby ordenação secundaria //query = query.OrderBy(q => q.Album.Titulo).ThenBy(q=> q.Nome); foreach (var item in query) { Console.WriteLine("{0}\t{1}", item.Album.Titulo.PadRight(40), item.Nome); } }