Usuário com melhor resposta
Retornar Dados RIA SERVICES

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).
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
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
-
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);
-
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:
Samuel Fabel
-
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?
-
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
-