Usuário com melhor resposta
Linq to sql - último dia de cada mês

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
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(); }
- Editado Fulvio Cezar Canducci Dias terça-feira, 7 de janeiro de 2014 13:51
- Marcado como Resposta .NET Developer iniciante quarta-feira, 8 de janeiro de 2014 12:55
-
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();
- Marcado como Resposta .NET Developer iniciante quarta-feira, 8 de janeiro de 2014 12:55
Todas as 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 "/
-
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(); }
- Editado Fulvio Cezar Canducci Dias terça-feira, 7 de janeiro de 2014 13:51
- Marcado como Resposta .NET Developer iniciante quarta-feira, 8 de janeiro de 2014 12:55
-
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();
- Marcado como Resposta .NET Developer iniciante quarta-feira, 8 de janeiro de 2014 12:55
-
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
- Editado .NET Developer iniciante quarta-feira, 8 de janeiro de 2014 13:02
-
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