none
DateTime com Linq to Entities RRS feed

  • Pergunta

  • Bom dia,

      Tenho uma grid onde tenho que filtrar os valores por mês/Ano, ou seja, quero ver os pedidos de um determinado mês/Ano.
    No banco de dados tenho um campo na tabela que está definido como dateTime, salvando a data completa. E quando quero fazer uma pesquisa do pedido, tenho que pegar apenas o mês/Ano para efetuar essa busca.
    Fiz um método para filtrar os pedidos. Não estou conseguindo pegar apenas o mês/Ano, se eu fizer com subString, não da certo pq tenho que converter para dateTime por causa do campo que está na tabela é dateTime.
    Alguma idéia?


    - Campo que recebe o mês/Ano para a pesquisa.

       DateTime mesAno = DateTime.Parse(this.txt_psqMesAno.Text);
       this.StoreDstPedido.DataSource = PedidoController.PesquisaPedido(int.Parse(dstId), mesAno); //Passa os valores por parametros para o método.
       this.StoreDstPedido.DataBind();

    - Método de Pesquisa


            public static List<Pedido> PesquisaPedido(int idPdd, DateTime mesAno)
            {
                //seta a variável lista           
                List<Pedido> lista = null;

                using (revendaEntities context = new revendaEntities())
                {
                    IQueryable<Pedido> query =
                    from pedido in context.PedidoSet.Include("Distribuidor.Cliente")
                    where pedido.distribuidor.dstId == idPdd && pedido.pddDtPedido == mesAno //Preciso passar apenas o mes/Ano neste atributo.
                    orderby pedido.pddId ascending
                    select pedido;
                    lista = query.ToList();
                }
                return lista;
            }

    Obrigado pela atenção!
    terça-feira, 10 de novembro de 2009 10:24

Respostas

  • Olá,

    Uma solução seria pegar o primeiro e o último dia do mes/ano e verificar se a data está nesse intervalo.

    Para pegar oi último dia do mes utilize DateTime.DaysInMonth();

    Ex.:

    using (revendaEntities context = new revendaEntities())
                {
                    IQueryable<Pedido> query =
                    from pedido in context.PedidoSet.Include("Distribuidor.Cliente")
                    where pedido.distribuidor.dstId == idPdd &&
                    pedido.pddDtPedido >= mesAno && // Maior igual ao primeiro dia do mês
                    pedido.pddDtPedido <= new DateTime(mesAno.Year, mesAno.Month, 
                        DateTime.DaysInMonth(mesAno.Year, mesAno.Month)) // Menor igual ao último dia do mês
                    orderby pedido.pddId ascending
                    select pedido;
                    lista = query.ToList();
                }
                return lista;
    Você também pode criar uma função quer retorna primeiro e último dia do mês como nesse artigo:

    http://www.devprise.com/2006/10/03/getting-the-first-and-last-day-of-the-month-with-net-c/

    Abraço!



    Roberto Santos http://blog.robertoosantos.com
    • Marcado como Resposta Júnior da Maia terça-feira, 10 de novembro de 2009 12:22
    terça-feira, 10 de novembro de 2009 10:41
  • Bom dia,

    Consegui fazer a pesquisa. Usei o mesmo conceito do seu método, mas tive que mudar a maneira de pegar o último dia do mês, por que estava dando um erro quando chagava na linha que faz a comparação com o último dia do mês.

    pedido.pddDtPedido <= new DateTime(mesAno.Year, mesAno.Month, mesAno.Day) // Menor igual ao último dia do mês

    Meu método ficou assim:

    - Método de Pesquisa


    public static List<Pedido> PesquisaPedido(int idPdd, DateTime mesAno)
    {
      DateTime primeiroDiaDoMes = new DateTime(mesAno.Year, mesAno.Month, 1);
      DateTime ultimoDiaDoMes = primeiroDiaDoMes.AddMonths(1).AddDays(-1);

      //seta a variável lista          
      List<Pedido> lista = null;

      using(revendaEntities context = new revendaEntities())
      {

       IQueryable<Pedido> query = from pedido in context.PedidoSet.Include("Distribuidor.Cliente")
        where pedido.distribuidor.dstId == idPdd &&
              pedido.pddDtPedido >= mesAno && pedido.pddDtPedido <= ultimoDiaDoMes
        orderby pedido.pddId ascending
        select pedido;
        lista = query.ToList();
       }
       return lista;
    }


    Obrigado pela atenção!
    • Marcado como Resposta Júnior da Maia terça-feira, 10 de novembro de 2009 12:21
    terça-feira, 10 de novembro de 2009 12:10

Todas as Respostas

  • Olá,

    Uma solução seria pegar o primeiro e o último dia do mes/ano e verificar se a data está nesse intervalo.

    Para pegar oi último dia do mes utilize DateTime.DaysInMonth();

    Ex.:

    using (revendaEntities context = new revendaEntities())
                {
                    IQueryable<Pedido> query =
                    from pedido in context.PedidoSet.Include("Distribuidor.Cliente")
                    where pedido.distribuidor.dstId == idPdd &&
                    pedido.pddDtPedido >= mesAno && // Maior igual ao primeiro dia do mês
                    pedido.pddDtPedido <= new DateTime(mesAno.Year, mesAno.Month, 
                        DateTime.DaysInMonth(mesAno.Year, mesAno.Month)) // Menor igual ao último dia do mês
                    orderby pedido.pddId ascending
                    select pedido;
                    lista = query.ToList();
                }
                return lista;
    Você também pode criar uma função quer retorna primeiro e último dia do mês como nesse artigo:

    http://www.devprise.com/2006/10/03/getting-the-first-and-last-day-of-the-month-with-net-c/

    Abraço!



    Roberto Santos http://blog.robertoosantos.com
    • Marcado como Resposta Júnior da Maia terça-feira, 10 de novembro de 2009 12:22
    terça-feira, 10 de novembro de 2009 10:41
  • Bom dia,

    Consegui fazer a pesquisa. Usei o mesmo conceito do seu método, mas tive que mudar a maneira de pegar o último dia do mês, por que estava dando um erro quando chagava na linha que faz a comparação com o último dia do mês.

    pedido.pddDtPedido <= new DateTime(mesAno.Year, mesAno.Month, mesAno.Day) // Menor igual ao último dia do mês

    Meu método ficou assim:

    - Método de Pesquisa


    public static List<Pedido> PesquisaPedido(int idPdd, DateTime mesAno)
    {
      DateTime primeiroDiaDoMes = new DateTime(mesAno.Year, mesAno.Month, 1);
      DateTime ultimoDiaDoMes = primeiroDiaDoMes.AddMonths(1).AddDays(-1);

      //seta a variável lista          
      List<Pedido> lista = null;

      using(revendaEntities context = new revendaEntities())
      {

       IQueryable<Pedido> query = from pedido in context.PedidoSet.Include("Distribuidor.Cliente")
        where pedido.distribuidor.dstId == idPdd &&
              pedido.pddDtPedido >= mesAno && pedido.pddDtPedido <= ultimoDiaDoMes
        orderby pedido.pddId ascending
        select pedido;
        lista = query.ToList();
       }
       return lista;
    }


    Obrigado pela atenção!
    • Marcado como Resposta Júnior da Maia terça-feira, 10 de novembro de 2009 12:21
    terça-feira, 10 de novembro de 2009 12:10