Conversion specified is not valid

2

I'm doing a query with LINQ on DataTable in that snippet of code. I have to check if there is already a link for person registered in the database. My query using LINQ is working perfectly, the problem is to store query.Count() in a variable of type int .

I'm using the Visual Studio 2010 release. I ran the test on the 2013 release and it worked fine. What could be done to store the value of query.Count() in a variable of type int or to use in if() ?

//Retorna a relação dos Vinculos contida na base de dados 

DataTable PessoasVinculadas = Pessoa.ConsultarPessoasVinculadas(idPessoaReferenciada);
//Procura os registros existentes 
var query = PessoasVinculadas.AsEnumerable().Where(x => x.Field<int>("tipo") == TipoVinculo && x.Field<int>("pessoa_referenciada_id")
== idPessoaReferenciada && x.Field<int>("pessoa_vinculada_id") == idPessoaVinculada);
//Conta os registro existentes 
int cont = query.Count();

//Se registro for igual a 0 Adicionar 
if (cont == 0)
{
    //Cria Vinculo 
    Pessoa.Adicionar(TipoVinculo, idPessoaReferenciada, idPessoaVinculada);
}

Suggested solution

 var query = PessoasVinculadas.AsEnumerable()
                         .Where(x => x.Field<int>("tipo") == TipoVinculo
                          && x.Field<int>("pessoa_referenciada_id") == idPessoaReferenciada
                          && x.Field<int>("pessoa_vinculada_id") == idPessoaVinculada).ToList();

                        int cont = query.Count;

Exception message:

System.InvalidCastException was caught
  HResult=-2147467262
  Message=Conversão especificada não é válida.
  Source=System.Data.DataSetExtensions
  StackTrace:
       em System.Data.DataRowExtensions.UnboxT'1.ValueField(Object value)
       em Gerencial.Formularios.Gestao.Licenca.ImportarPessoaVinculo.<>c__DisplayClass5.<backgroundWorker_DoWork>b__0(DataRow x) na C:\Users\mmurta\documents\visual studio 2010\Projects\Gerencial\Gerencial\Formularios\Gestao\Licenca\ImportarPessoaVinculo.cs:linha 240
       em System.Linq.Enumerable.WhereEnumerableIterator'1.MoveNext()
       em System.Collections.Generic.List'1..ctor(IEnumerable'1 collection)
       em System.Linq.Enumerable.ToList[TSource](IEnumerable'1 source)
       em Gerencial.Formularios.Gestao.Licenca.ImportarPessoaVinculo.backgroundWorker_DoWork(Object sender, DoWorkEventArgs e) na C:\Users\mmurta\documents\visual studio 2010\Projects\Gerencial\Gerencial\Formularios\Gestao\Licenca\ImportarPessoaVinculo.cs:linha 239
  InnerException: 
    
asked by anonymous 16.10.2015 / 14:54

2 answers

2

The error you are experiencing is not in Count . It's here:

var query = PessoasVinculadas
                .AsEnumerable()
                .Where(x => x.Field<int>("tipo") == TipoVinculo && 
                            x.Field<int>("pessoa_referenciada_id") == idPessoaReferenciada && 
                            x.Field<int>("pessoa_vinculada_id") == idPessoaVinculada);

Some of these variables are not int . Check conversions.

In addition, the test can be greatly simplified to:

if (!PessoasVinculadas
                .AsEnumerable()
                .Any(x => x.Field<int>("tipo") == TipoVinculo && 
                            x.Field<int>("pessoa_referenciada_id") == idPessoaReferenciada && 
                            x.Field<int>("pessoa_vinculada_id") == idPessoaVinculada))
{
    //Cria Vinculo 
    Pessoa.Adicionar(TipoVinculo, idPessoaReferenciada, idPessoaVinculada);
}

The performance of Count is typically less than that of Any , and you do not want to tell, exactly. You want to know if there are no records, then Any if suit better.

    
16.10.2015 / 16:46
2
  

What could be done to store the value of the query.Count () in a variable of type int or to use in if ()?

You can convert your query to a list and use the Count property

var count = PessoasVinculadas.AsEnumerable()
                             .Count(x => x.Field<int>("tipo") == TipoVinculo 
                              && x.Field<int>("pessoa_referenciada_id") == idPessoaReferenciada 
                              && x.Field<int>("pessoa_vinculada_id") == idPessoaVinculada);

EDIT

Your problem is in the values inside Count() , some value there is not integer, so the conversion error.

    
16.10.2015 / 15:07