Usuário com melhor resposta
Herança de Classe - Conversão especificada não é válida

Pergunta
-
Olá,
Tenho uma classe Colaborador, essa classe é abstrata. Tenho a classe ColaboradorFisico que é uma classe que herda de Colaborador.
No ColaboradorFisico eu tenho o campo CPF.
Minha tabela Colaborador tem a informação do CPF. Preciso verificar se existe um CPF cadastrado na tabela de colaborador antes de inserir. Para isso fiz este método:
internal bool VerificarExisteCPF(string cpf)
{
return !colaboradores.OfType<ColaboradorFisico>().Any(c => c.CPF == cpf);
}Entretanto ele diz que a Conversão especificada não é válida.
Como posso fazer para buscar por campos de minha classe filha?
Obrigado.
Respostas
-
Adriano,
Segue um modelo que irá lhe ajudar
http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx
var query = from p in ctx.GetTable<Person>().OfType<Employee>() select p; foreach (Person p in query) { // Do something with employees }
- Marcado como Resposta Adriano Galesso segunda-feira, 18 de outubro de 2010 15:07
Todas as Respostas
-
Adriano,
Você poderia postar exatamente a mensagem de erro completa que você está recebendo?
André Alves de Lima
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Bom dia André,
O Table do Data Context encapsula o erro, mas é o "Specified cast is not valid". Da para ver pelo Result View.
Esse é o Stack Trace:
at System.Data.SqlClient.SqlBuffer.get_Int32()
at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)
at Read_Colaborador(ObjectMaterializer`1 )
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Linq.SystemCore_EnumerableDebugView`1.get_Items()É um problema do cão, pois não estou conseguindo realizar filtros com classes herdadas, por exemplo:
var colaboradorF = from colab in colaboradores.OfType<ColaboradorFisico>() where colab.TipoColaborador == TipoColaborador.Físico && colab.Nome.Contains(cFisico.Nome) || string.IsNullOrEmpty(cFisico.Nome) && colab.Sobrenome.Contains(cFisico.Sobrenome) || string.IsNullOrEmpty(cFisico.Sobrenome) && colab.CPF.Contains(cFisico.CPF) || string.IsNullOrEmpty(cFisico.CPF) && colab.Status == cFisico.Status || cFisico.Status == null orderby colab.Nome select colab;
Ele da a mesma exception. "Specified cast is not valid", mas eu preciso do OfType<ColaboradorFisico> pois o CPF, sobrenome e outros dados estão nele. E preciso efetuar filtros neste campo.
Obrigado!
-
Adriano,
Segue um modelo que irá lhe ajudar
http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx
var query = from p in ctx.GetTable<Person>().OfType<Employee>() select p; foreach (Person p in query) { // Do something with employees }
- Marcado como Resposta Adriano Galesso segunda-feira, 18 de outubro de 2010 15:07
-
Seilor,
Passei por este Blog 100 vezes mas parace que só agora consegui notar a burrice que eu estava fazendo.
A conversão inválida não eram nas minhas classes herdadas e sim no mapeamento do meu descriminador. Acontece que ele é um enumerador no C# e tipo smallint no banco de dados, o mapeamento estava assim:
<Column Name="Tipo_Colaborador" Member="TipoColaborador" IsDiscriminator="true"/>
Precisei apenas informar o tipo:
<Column Name="Tipo_Colaborador" Member="TipoColaborador" IsDiscriminator="true" DbType="smallint"/>
Agora sim está ok. Tô me ferrando com esses mapeamentos em XML.
Obrigado pessoal
Adriano Galesso Alves Blog: http://www.lixeiradodri.blogspot.com/ Twitter: @AdGalesso