none
Obter apenas um campo de uma tabela com o Entity Framework Silverlight RRS feed

  • Pergunta

  • Como posso Obter apenas um campo de uma tabela com o Entity Framework Silverlight

    eu estou tentando assim ,

      DoService1 dos = new DoService1();

      IQueryable<tbusuario> tbusu = dos.GetUnicoQuery(txtLogin.Text);

    mais está dando erro, qual é o correto ???/

    desde já agradeço.

    Mauro

     

    quinta-feira, 14 de outubro de 2010 11:34

Respostas

  • Obrigado Rui, 

        isto agora funcionou, valeu pela ajuda, o problema agora é acessar o campo,

        estou tentando isto

     

              IQueryable<tbusuario> tbusu = dos.GetUnicoQuery(txtLogin.Text).Query.OfType<tbusuario>();

                foreach (var campos in tbusu)

               {

                  txtBoasVindas.Text  = campos.LOGIN_USU.ToString();

               }

              entretando gera um erro de  --->>>> "Value cannot be null";

     

          Novamente obrigado pela ajuda.

     

     

    • Marcado como Resposta Otoni sexta-feira, 15 de outubro de 2010 17:12
    sexta-feira, 15 de outubro de 2010 11:34
  • Olá Otoni,

    Está retornando nulo porque você está utilizando o ria services como se sua consulta fosse síncrona.

    Lembre-se que o silverlight precisa efetuar uma chamada para o servidor para recuperar o dado que você precisa e a resposta pode demorar um pouco para retornar. Essa é uma operação assíncrona.

    Para resolver isso, você tem que fazer algo mais ou menos assim:

    1 - Prepare sua query:

    EntityQuery<tbusuario> query = dos.GetUnicoQuery(txtLogin.Text);

    Isso ainda não executou nada, somente preparou o seu objeto que representa a consulta.

    2 - Execute uma operação de Load

    dos.Load(query, LoadBehavior.MergeIntoCurrent, LoadUsuarioFim, null);

    Essa é a consulta de verdade, usando webservices, etc, tudo feito automático via Ria Services.

    LoadUsuarioFim é o nome do método que será executado quando a operação de load terminar. 

    3 - Use a informação recebida

    private void LoadUsuarioFim(LoadOperation<tbusuario> loadOperation) {
     if(loadOperation.HasError) {
      //trate o erro aqui
      return;
     }
     tbusuario usuario = loadOperation.Entities.FirstOrDefault();
     if(usuario == null) {
      //não foi retornado nenhum usuario, talvez você passou 
      //um parametro errado ou a tabela está vazia
      //trate esse erro aqui 
      return;
     }
     txtBoasVindas.Text = usuario.LOGIN_USU;			
    }
    

    LoadOperation é sua operação de consulta. Se houve algum erro, a propriedade "HasError" vai retornar true e você pode acessar o erro via loadOperation.Error. Caso contrário, loadOperation.Entities vai retornar com as entidades que satisfazem sua query.

    Espero que tenha ajudado. Me diga se algo deu errado.

    Abc,

     


    -- André Carlucci - Way2 Technology - twitter/andrecarlucci
    • Editado andrecarlucciMVP sexta-feira, 15 de outubro de 2010 12:52 formatacao
    • Marcado como Resposta Otoni sexta-feira, 15 de outubro de 2010 17:12
    sexta-feira, 15 de outubro de 2010 12:46

Todas as Respostas

  • Qual a mensagem de erro?
    quinta-feira, 14 de outubro de 2010 12:20
    Moderador
  • o seguinte erro acontece quando pressiono o F5

     

    Cannot implicity convert type

    'System.ServiceModel.DomainServices.Client.EntityQuery<AppTopList.Web.tbusuario>' to

    'System.Linq.IQueryable<AppTopList.Web.tbusuario>'

     

    Valeu

    Mauro Otoni 

    quinta-feira, 14 de outubro de 2010 16:43
  • vc pode arrumar assim:

    EntityQuery<AppTopList.Web.tbusuario> tbusu = dos.GetUnicoQuery(txtLogin.Text);

    ou assim:

    IQueryable<tbusuario> tbusu = dos.GetUnicoQuery(txtLogin.Text).AsQueryable();

     


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    quinta-feira, 14 de outubro de 2010 17:37
    Moderador
  • Rui, depois desta alteração surge o erro .:

     

    'System.ServiceModel.DomainServices.Client.EntityQuery<AppTopList.Web.tbusuario>' does not contain a definition for 'AsQueryable' and the best extension method overload 'System.Linq.Queryable.AsQueryable(System.Collections.IEnumerable)' has some invalid arguments F:\DesenvVStudio2010\AppTopListOld\AppTopList\MainPage.xaml.cs 83 43 AppTopList



    valeu.

    quinta-feira, 14 de outubro de 2010 22:30
  • Ah desculpe.. RIA Services tem sua peculariedades.... entao... o EntityQuery tem uma propriedade Query que retorna um IQueryable não tipado....

    então o que vc pode fazer é: 

     

    IQueryable<tbusuario> tbusu = dos.GetUnicoQuery(txtLogin.Text).Query.OfType<tbusuario>();


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    quinta-feira, 14 de outubro de 2010 23:59
    Moderador
  • Obrigado Rui, 

        isto agora funcionou, valeu pela ajuda, o problema agora é acessar o campo,

        estou tentando isto

     

              IQueryable<tbusuario> tbusu = dos.GetUnicoQuery(txtLogin.Text).Query.OfType<tbusuario>();

                foreach (var campos in tbusu)

               {

                  txtBoasVindas.Text  = campos.LOGIN_USU.ToString();

               }

              entretando gera um erro de  --->>>> "Value cannot be null";

     

          Novamente obrigado pela ajuda.

     

     

    • Marcado como Resposta Otoni sexta-feira, 15 de outubro de 2010 17:12
    sexta-feira, 15 de outubro de 2010 11:34
  • Olá Otoni,

    Está retornando nulo porque você está utilizando o ria services como se sua consulta fosse síncrona.

    Lembre-se que o silverlight precisa efetuar uma chamada para o servidor para recuperar o dado que você precisa e a resposta pode demorar um pouco para retornar. Essa é uma operação assíncrona.

    Para resolver isso, você tem que fazer algo mais ou menos assim:

    1 - Prepare sua query:

    EntityQuery<tbusuario> query = dos.GetUnicoQuery(txtLogin.Text);

    Isso ainda não executou nada, somente preparou o seu objeto que representa a consulta.

    2 - Execute uma operação de Load

    dos.Load(query, LoadBehavior.MergeIntoCurrent, LoadUsuarioFim, null);

    Essa é a consulta de verdade, usando webservices, etc, tudo feito automático via Ria Services.

    LoadUsuarioFim é o nome do método que será executado quando a operação de load terminar. 

    3 - Use a informação recebida

    private void LoadUsuarioFim(LoadOperation<tbusuario> loadOperation) {
     if(loadOperation.HasError) {
      //trate o erro aqui
      return;
     }
     tbusuario usuario = loadOperation.Entities.FirstOrDefault();
     if(usuario == null) {
      //não foi retornado nenhum usuario, talvez você passou 
      //um parametro errado ou a tabela está vazia
      //trate esse erro aqui 
      return;
     }
     txtBoasVindas.Text = usuario.LOGIN_USU;			
    }
    

    LoadOperation é sua operação de consulta. Se houve algum erro, a propriedade "HasError" vai retornar true e você pode acessar o erro via loadOperation.Error. Caso contrário, loadOperation.Entities vai retornar com as entidades que satisfazem sua query.

    Espero que tenha ajudado. Me diga se algo deu errado.

    Abc,

     


    -- André Carlucci - Way2 Technology - twitter/andrecarlucci
    • Editado andrecarlucciMVP sexta-feira, 15 de outubro de 2010 12:52 formatacao
    • Marcado como Resposta Otoni sexta-feira, 15 de outubro de 2010 17:12
    sexta-feira, 15 de outubro de 2010 12:46
  • Olha alem das observaçoes do Andre acima...

    um objeto nulo, não pode acessar o metodo ToString()

    exemplo:

    string Teste = null;
    Console.Write(Teste.ToString()); // Aqui da o erro "Value cannot be null" pq Null não implementa o metodo ToString();
    Teste = "";
    Console.Write(Teste.ToString()); // Aqui funciona ok ...

    Mas no seu caso... se LOGIN_USU ja for uma string não prescisa usar o metodo ToString(), se não for verifica se o Login não é nulo

    IQueryable<tbusuario> tbusu = dos.GetUnicoQuery(txtLogin.Text).Query.OfType<tbusuario>();
     foreach (var campos in tbusu) {
        if (campos.LOGIN_USU != null) {
             txtBoasVindas.Text  = campos.LOGIN_USU.ToString();
        }

        OU

         txtBoasVindas.Text  = campos.LOGIN_USU;
     }

     

     


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    sexta-feira, 15 de outubro de 2010 13:51
    Moderador
  • Valeu Andre, era isto mesmo. Você acertou na mosca. Mais uma vez obrigado. Assunto resolvido. Mauro Otoni
    sexta-feira, 15 de outubro de 2010 17:16
  • Obrigado Rui, valeu muito sua ajuda.

     

    Problema resolvido.

     

    Mauro Otoni

    sexta-feira, 15 de outubro de 2010 17:18