none
Retornar Dados RIA SERVICES RRS feed

  • Pergunta

  • Estou desenvolvendo uma REDE SOCIAL.

    Após o usuário fazer login, entra em sua páginal pessoal, onde eu desejaria retornar os seus dados cadastrados, como NOME COMPLETO, FOTO, FORMAÇÃO, CIDADE, etc.

    Usando o RIA SERVICE, eu consigo retornar esses dados num DATAGRID, porém, gostaria de retornar TEXTBOX e IMAGEM.

    Queria saber como filtrar os dados de cada usuário, uma vez que tenho o usuário logado pelo webContex.current.user.name, e retornar na tela nos campos especificos (textbox e imagem), os dados desejados (NOME COMPLETO, FOTO, FORMAÇÃO, CIDADE, etc).

    quarta-feira, 2 de janeiro de 2013 16:38

Respostas

  • Boa Tarde,

    Desculpa a demora em responder. Eu fiz um exemplo utilizando pedido e item de pedido. As entidades são diferentes, mas a idéia é a mesma:

    int idPedido = 1;
    
    DomainService1 d = new DomainService1();
    
    d.Load(d.GetTBPedidosByIdQuery(idPedido), i =>
    {
    	if (i.Entities.Count() > 0)
    	{
    		var pedido = i.Entities.FirstOrDefault(t => t.IdPedido == idPedido);
    
    		d.Load(d.GetTBItemPedidosByIdPedidoQuery(pedido.IdPedido), j =>
    			{
    				TextBlock1.Text = pedido.NomeCliente;
    				dataGrid1.ItemsSource = j.Entities.Where(t => t.IdPedido == pedido.Codigo);
    			}, null);
    	}
    }, null);


    int idPedido = 1;
    
    DomainService1 d = new DomainService1();
    
    d.Load(d.GetTBItemPedidosQuery(), i =>
    {
    	d.Load(d.GetTBPedidosByIdQuery(idPedido), j =>
    	{
    		var pedido = j.Entities.FirstOrDefault(t => t.Codigo == idPedido);
    
    		TextBlock1.Text = pedido.Observacao;
    		dataGrid1.ItemsSource = i.Entities.Where(t => t.CodigoPedido == pedido.Codigo);
    
    	}, null);
    }, null);

    É claro que se você for pesquisar devem existir mais n opções para você fazer. É claro que o segundo exemplo parece absurdo, mas se for pensar de alguém colocando um domain que pode ser acessado por toda a aplicação e a cidade é utilizada varias vezes, deixa de ser algo absurdo. Tudo depende do seu escopo.

    Espero que ajude


    Samuel Fabel

    • Marcado como Resposta jdesiderio domingo, 10 de fevereiro de 2013 10:56
    quinta-feira, 31 de janeiro de 2013 15:20

Todas as Respostas

  • Bom dia,

    Para mim, o jeito mais simples seria este:

    No domain service, colocar um outro método além do GetUsuario ou seja lá o que for. No exemplo, estou utilizando cliente:

     
    [EnableClientAccess()]
    public class DomainService1 : LinqToEntitiesDomainService<DBCadastroEntities>
    {
    
    	[Query(IsDefault = true)]
    	public IQueryable<TBClientes> GetTBClientes()
    	{
    		return this.ObjectContext.TBClientes;
    	}
    
    	[Query]
    	public IQueryable<TBClientes> GetTBClientesById(int codigo)
    	{
    		return this.ObjectContext.TBClientes.Where(i=> i.Codigo == codigo);
    	}
    }

    No silverlight, o procedimento é meio complicado simples uma vez que entender:

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
    	int codigoCliente = 1;
    
    	DomainService1 d = new DomainService1();
    
    	var query = d.GetTBClientesByIdQuery(codigoCliente);
    
    	d.Load(query, c =>
    			{
    				var client = c.Entities.FirstOrDefault();
    
    				nomeTextBox.Text = client.Nome;
    				enderecoTextBox.Text = client.Endereco;
    			}, null);
    }

    É claro. Existem alguns outros modos. Este é apenas um deles.

    Espero que ajude,

    Atenciosamente,


    Samuel Fabel

    sexta-feira, 4 de janeiro de 2013 13:39
  • Consegui retornar os dados com o código que você me mandou, porém tenho uns dados que vem de outras tabelas e ele não esta retornando, por exemplo.

    Tenho uma tabela TBUSUARIO com os seguintes campos:

    idUsuario RETORNA OK

    Usuario RETORNA OK

    DataNascimento RETORNA OK

    idCidadeOrigem NÃO RETORNA

    TABELA TBCIDADEORIGEM

    idCidadeOrigem

    CidadeOrigem

    CodIBGE

    IdEstado

    o código está assim

    DomainService1 d = new DomainService1(); var query = d.GetTBUsuarioByIdQuery(idUsuario); d.Load(query, c => { var usuari = c.Entities.FirstOrDefault(); txbUsuario.Text = usuari.Usuario; dtpDataNascimento.value = usuari.DataNascimento;

    txbCidade.Text = usuari.tbCidadeOrigem.CidadeOrigem; ERRO Object reference not set to an instance of an object. }, null);

    sábado, 19 de janeiro de 2013 15:13
  • Boa Tarde,

    No caso, o senhor está utilizando tabelas relacionadas no Entity Framework com referencias formadas pelo próprio Entity. O Entity Framework assim como o Hibernate, Nhibernate entre outros tem um esquema de manipulação de dados dos filhos chamado Lazy Loading. O Entity Framework vai um pouco além deste Lazy Loading e carrega a informação de uma propriedade que é uma referencia a outra tabela somente quando esta é acessada. No entanto estamos falando de um serviço. No caso, o RIA service não trabalha com Lazy Loading. Existe 2 maneiras de resolver isto:

    1) Carregar todas cidades antes no domain do silverlight e quando for buscar as informações do usuário as informações da cidade já estarão carregadas

    2) Fazer uma subchamada para carregar a cidade depois de ter carregado o usuário

    No link abaixo teve uma resposta sobre o que eu estou lhe falando:

    http://social.msdn.microsoft.com/Forums/en-US/silverlightwcf/thread/9dfe3d6b-a90e-4009-85e3-58b22ce567b8


    Samuel Fabel

    terça-feira, 22 de janeiro de 2013 15:32
  • Samuel, sem querer abusar demais de sua boa vontade, poderia me dar uma exemplo de como fazer isso?

    1) Carregar todas cidades antes no domain do silverlight e quando for buscar as informações do usuário as informações da cidade já estarão carregadas

    2) Fazer uma subchamada para carregar a cidade depois de ter carregado o usuário

    Desculpe a ignorância mais é que estou aprendendo e pior ainda sozinho, apenas com leitura e videos.

    Eu preciso criar uma classe separada para fazer esse carregamento ou posso fazer isso dentro da própria Page?

    quarta-feira, 23 de janeiro de 2013 16:39
  • Boa Tarde,

    Desculpa a demora em responder. Eu fiz um exemplo utilizando pedido e item de pedido. As entidades são diferentes, mas a idéia é a mesma:

    int idPedido = 1;
    
    DomainService1 d = new DomainService1();
    
    d.Load(d.GetTBPedidosByIdQuery(idPedido), i =>
    {
    	if (i.Entities.Count() > 0)
    	{
    		var pedido = i.Entities.FirstOrDefault(t => t.IdPedido == idPedido);
    
    		d.Load(d.GetTBItemPedidosByIdPedidoQuery(pedido.IdPedido), j =>
    			{
    				TextBlock1.Text = pedido.NomeCliente;
    				dataGrid1.ItemsSource = j.Entities.Where(t => t.IdPedido == pedido.Codigo);
    			}, null);
    	}
    }, null);


    int idPedido = 1;
    
    DomainService1 d = new DomainService1();
    
    d.Load(d.GetTBItemPedidosQuery(), i =>
    {
    	d.Load(d.GetTBPedidosByIdQuery(idPedido), j =>
    	{
    		var pedido = j.Entities.FirstOrDefault(t => t.Codigo == idPedido);
    
    		TextBlock1.Text = pedido.Observacao;
    		dataGrid1.ItemsSource = i.Entities.Where(t => t.CodigoPedido == pedido.Codigo);
    
    	}, null);
    }, null);

    É claro que se você for pesquisar devem existir mais n opções para você fazer. É claro que o segundo exemplo parece absurdo, mas se for pensar de alguém colocando um domain que pode ser acessado por toda a aplicação e a cidade é utilizada varias vezes, deixa de ser algo absurdo. Tudo depende do seu escopo.

    Espero que ajude


    Samuel Fabel

    • Marcado como Resposta jdesiderio domingo, 10 de fevereiro de 2013 10:56
    quinta-feira, 31 de janeiro de 2013 15:20
  • Muito grato Samuel...

    Você é 10....

    domingo, 10 de fevereiro de 2013 10:56