Usuário com melhor resposta
Obter apenas um campo de uma tabela com o Entity Framework Silverlight

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
-
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 -
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 -
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 -
Valeu Andre, era isto mesmo. Você acertou na mosca. Mais uma vez obrigado. Assunto resolvido. Mauro Otonisexta-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