none
Linq to sql - último dia de cada mês RRS feed

  • Pergunta

  • Galera,

    Estou com um problema, tenho registros em uma tabela e um dos campos é a data.

    Com linq preciso puxar o registro com a última data que tiver de cada mês nos últimos 12 meses. Porém, nem sempre vou ter registros no dia 31 e dia 30, ou seja o último registro de um mês pode ser dia 29,28,27 ou sabe-se lá quando.

    Estou pesquisando mas não faço ideia de como fazer isso. Alguém saberia me ajudar?

    Brigadão

    terça-feira, 7 de janeiro de 2014 00:21

Respostas

  • Então cara...

    Na verdade eu nem sei se é possível fazer isso com apenas um select. De qualquer maneira estou tentando imaginar qual as minhas opções. Se eu poderia criar uma estrutura de repetição na própria aplicação pra puxar o último de cada mês...

    Mas o ideal era que tivesse uma forma de filtrar o último registro de cada mês. Não sei se isso é possível "/

    C# ou VB.NET?

    Linq to SQL é a camada de persistência ?

    ou é 

    Entity Framework?

    Exemplo eu faço assim

    Tenho uma tabela com nome de tbDatas

    com os campos Id, Data e Valor

    Para que eu agregue via SQL faço assim: 

    SELECT A.Id, A.Data, A.Valor, B.Mes, B.Ano From tbDatas A INNER JOIN
    (SELECT MONTH(Data) Mes, YEAR(Data) Ano, MAX(Data) DataMaxima
     FROM tbDatas Group By MONTH(Data), YEAR(Data)) B ON A.Data = B.DataMaxima

    Via Linq:

    try
    {
    	app.Database.Log = msg => textBox2.Text += msg.ToString();
    	/*SELECT A.Id, A.Data, A.Valor, B.Mes, B.Ano From tbDatas A INNER JOIN
    	(SELECT MONTH(Data) Mes, YEAR(Data) Ano, MAX(Data) DataMaxima
    		FROM tbDatas Group By MONTH(Data), YEAR(Data)) B ON A.Data = B.DataMaxima*/
    
    	var lista = app.tbDatas.GroupBy(x => new
    	{
    		Mes = x.Data.Month,
    		Ano = x.Data.Year
    	}).Select(s => new
    	{
    		Id = s.FirstOrDefault(g => g.Data == (s.Max(m => m.Data))).Id,
    		DataMaxima = s.Max(m => m.Data),
    		Valor = s.FirstOrDefault(g => g.Data == (s.Max(m => m.Data))).Valor,
    		s.Key.Mes,
    		s.Key.Ano,
    	}).ToArray();
    
    	dataGridView2.DataSource = lista;
    }
    catch (Exception ex)
    {
    	MessageBox.Show(ex.Message);
    }
    finally
    {
    	app.Dispose();
    }

    Fulvio Cezar Canducci Dias



    terça-feira, 7 de janeiro de 2014 12:50
  • Assim é mais rápido !!!

    var lista = app.tbDatas.GroupBy(x => new
                    {
                        Mes = x.Data.Month,
                        Ano = x.Data.Year,
                    }).Select(s => new
                    {
                        DataMaxima = s.Max(m => m.Data),
                        s.Key.Mes,
                        s.Key.Ano,
                    });
    
                    var lista2 = app.tbDatas
                        .Join(lista, x => x.Data, g => g.DataMaxima, (x, g) => new { x, g })
                        .Select(s => new
                        {
                          Id = s.x.Id,
                          Mes = s.g.Mes, 
                          Ano = s.g.Ano,
                          Data = s.g.DataMaxima
                        }).ToArray();


    Fulvio Cezar Canducci Dias

    terça-feira, 7 de janeiro de 2014 14:14

Todas as Respostas

  • Vc conseguiu criar a query em sql ?
    terça-feira, 7 de janeiro de 2014 09:58
  • Então cara...

    Na verdade eu nem sei se é possível fazer isso com apenas um select. De qualquer maneira estou tentando imaginar qual as minhas opções. Se eu poderia criar uma estrutura de repetição na própria aplicação pra puxar o último de cada mês...

    Mas o ideal era que tivesse uma forma de filtrar o último registro de cada mês. Não sei se isso é possível "/

    terça-feira, 7 de janeiro de 2014 11:52
  • Então cara...

    Na verdade eu nem sei se é possível fazer isso com apenas um select. De qualquer maneira estou tentando imaginar qual as minhas opções. Se eu poderia criar uma estrutura de repetição na própria aplicação pra puxar o último de cada mês...

    Mas o ideal era que tivesse uma forma de filtrar o último registro de cada mês. Não sei se isso é possível "/

    C# ou VB.NET?

    Linq to SQL é a camada de persistência ?

    ou é 

    Entity Framework?

    Exemplo eu faço assim

    Tenho uma tabela com nome de tbDatas

    com os campos Id, Data e Valor

    Para que eu agregue via SQL faço assim: 

    SELECT A.Id, A.Data, A.Valor, B.Mes, B.Ano From tbDatas A INNER JOIN
    (SELECT MONTH(Data) Mes, YEAR(Data) Ano, MAX(Data) DataMaxima
     FROM tbDatas Group By MONTH(Data), YEAR(Data)) B ON A.Data = B.DataMaxima

    Via Linq:

    try
    {
    	app.Database.Log = msg => textBox2.Text += msg.ToString();
    	/*SELECT A.Id, A.Data, A.Valor, B.Mes, B.Ano From tbDatas A INNER JOIN
    	(SELECT MONTH(Data) Mes, YEAR(Data) Ano, MAX(Data) DataMaxima
    		FROM tbDatas Group By MONTH(Data), YEAR(Data)) B ON A.Data = B.DataMaxima*/
    
    	var lista = app.tbDatas.GroupBy(x => new
    	{
    		Mes = x.Data.Month,
    		Ano = x.Data.Year
    	}).Select(s => new
    	{
    		Id = s.FirstOrDefault(g => g.Data == (s.Max(m => m.Data))).Id,
    		DataMaxima = s.Max(m => m.Data),
    		Valor = s.FirstOrDefault(g => g.Data == (s.Max(m => m.Data))).Valor,
    		s.Key.Mes,
    		s.Key.Ano,
    	}).ToArray();
    
    	dataGridView2.DataSource = lista;
    }
    catch (Exception ex)
    {
    	MessageBox.Show(ex.Message);
    }
    finally
    {
    	app.Dispose();
    }

    Fulvio Cezar Canducci Dias



    terça-feira, 7 de janeiro de 2014 12:50
  • Assim é mais rápido !!!

    var lista = app.tbDatas.GroupBy(x => new
                    {
                        Mes = x.Data.Month,
                        Ano = x.Data.Year,
                    }).Select(s => new
                    {
                        DataMaxima = s.Max(m => m.Data),
                        s.Key.Mes,
                        s.Key.Ano,
                    });
    
                    var lista2 = app.tbDatas
                        .Join(lista, x => x.Data, g => g.DataMaxima, (x, g) => new { x, g })
                        .Select(s => new
                        {
                          Id = s.x.Id,
                          Mes = s.g.Mes, 
                          Ano = s.g.Ano,
                          Data = s.g.DataMaxima
                        }).ToArray();


    Fulvio Cezar Canducci Dias

    terça-feira, 7 de janeiro de 2014 14:14
  • Caramba... você manja muito de LINQ em Fúlvio. Coloquei pra rodar, fiz algumas alterações e funcionou! Agora, se eu te disser que entendi tudo que aconteceu estaria mentindo. Agora estou estudando LINQ pra entender melhor e também porque preciso que além de retornar a última data que seja a última data de cada investimento, ou seja,

    Id_investimento  data

    1                          25/04/2013

    2                          14/05/2013

    1                          27/04/2013

    1                          02/05/2013

    Deve retornar o único registro do investimento 2 e do 1 deve retornar dois registros: o dia 27/04 que é o último de abril e o 02/05 que é o último de maio.

    Porém, o que eu usava de LINQ era muito básico, eu usava coisas tipo: (from p in db.tabela where p.id == id_teste select p).toList()

    Estou estudando por esse material: http://msdn.microsoft.com/pt-br/library/bb308959.aspx

    Recomendam algum outro?

    Brigadão galera


    quarta-feira, 8 de janeiro de 2014 12:54
  • Caramba... vocês manjam muito de LINQ. Coloquei pra rodar, fiz algumas alterações e funcionou! Agora, se eu te disser que entendi tudo que aconteceu estaria mentindo. Agora estou estudando LINQ pra entender melhor e também porque preciso que além de retornar a última data que seja a última data de cada investimento, ou seja,

    Id_investimento  data

    1                          25/04/2013

    2                          14/05/2013

    1                          27/04/2013

    1     02/05/2013

    Deve retornar o único registro do investimento 2 e do 1 deve retornar dois registros: o dia 27/04 que é o último de abril e o 02/05 que é o último de maio.

    Porém, o que eu usava de LINQ era muito básico, eu usava coisas tipo: (from p in db.tabela where p.id == id_teste select p).toList()

    Estou estudando por esse material: http://msdn.microsoft.com/pt-br/library/bb308959.aspx

    Recomendam algum outro?

    Brigadão galera

    Esse Link para Linq: http://msdn.microsoft.com/en-us/vstudio/bb688088.aspx

    Fulvio Cezar Canducci Dias

    quarta-feira, 8 de janeiro de 2014 13:05