none
Filtro de Data em em Campo Nulo RRS feed

  • Pergunta

  • A uns posts atras eu perguntei como faço para incluir um campo de Data em uma Table Storage que já possui dados e me responderam que eu deveria colocar um "?" no tipo da variável e resolveu o meu problema, exemplo:

    public DateTime? LastUpdate { get; set; }
    

    Agora eu preciso fazer um filtro por este campo para os registros que já estão com ele preenchido, mas como ainda existem registros onde este campo não foi preenchido então dá erro de argumento inválido na pesquisa. Estou pesquisando da seguinte forma:

    var query = from c in Database.DataContext.CreateQuery<T>(this.TableName)
               where c.LastUpdate != null && c.LastUpdate >= lu_Data
               select c;
    

    Eu também queria os registro onde este campo ainda não foi alterado ou seja , onde ele ainda está nulo  eu tentei da seguinte forma:

    var query = from c in Database.DataContext.CreateQuery<T>(this.TableName)
                     where c.LastUpdate == null
                     select c;
    

    Mas ambas pesquisas deram erro dizendo que estou passando um argumento inválido.

     Como faço para resolver este problema?

    terça-feira, 22 de novembro de 2011 11:56

Respostas

  • Rick, uma situação que pode causar o problema relatado é, usando o emulador local de armazenamento (Storage Emulator), filtrar por um campo que ainda não foi criado em nenhum registro. No ambiente do Azure isto não causa erro, mas no ambiente de desenvolvimento será gerada uma mensagem como esta:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
      <code>InvalidInput</code>
      <message xml:lang="pt-BR">One of the request inputs is not valid.</message>
    </error>
    

    Portanto eu recomendo você assegurar-se que já foi realmente criado um registro da entidade na sua última versão, ANTES de usar os campos para filtragem.

    Inclusive uma dica útil é usar uma diretiva de compilação condicional na inicialização do aplicativo para, em ambiente de desenvolvimento, incluir uma entidade qualquer e excluí-la em seguida.

    Se isto não resolver, experimente com o projeto de exemplo que eu criei:

    1. Faça o download de: http://github.com/fernandoacorreia/ExperimentoTableStorage/zipball/master
    2. Abra a solução no Visual Studio
    3. ANTES DE EXECUTAR, desabilite 3 linhas de código que estão indicadas com a mensagem "REMOVER A LINHA ABAIXO PARA O PRIMEIRO TESTE". Uma está no arquivo Contato.cs e duas no arquivo HomeController.cs.
    4. Execute a aplicação web.
    5. Aperte algumas vezes em cada um dos botões, para inserir alguns registros (na primeira execução, os dois botões fazem a mesma coisa, porque a inserção de data foi desativada).
    6. Reative 2 linhas desabilitadas: uma em Contato.cs e a segunda em HomeController.cs. NÃO ATIVE AINDA A LINHA DA QUERY.
    7. Execute o projeto e insira um registro com data.
    8. Agora finalmente ative a linha da query para passar a filtrar por data.
    9. Execute o projeto; deverá mostrar apenas os registros incluídos com o campo data; não deverá mostrar os registros que foram incluídos quando o campo não existia na entidade.

    Se ainda assim não funcionar para você, por favor copie a mensagem de erro completa e gere uma solução de exemplo mostrando o problema que eu possa baixar para olhar.


    Fernando Correia
    pensandoazure.wordpress.com
    @facorreia
    terça-feira, 22 de novembro de 2011 14:52