none
Problema ao retornar valor null do banco RRS feed

  • Pergunta

  • Olá, estou novamente aqui para relatar meus problemas.

    Estou fazendo uma consulta no banco ex: 

    IQueryable<caixa> lista = caixabo.Find(n => n.id_empresa == idempresa && n.status.Equals("A") && n.dt_cadastro == data);

    e quando vou jogar um "Sum" desse resultado em variavel: 

    decimal debito  = lista.Where(n => n.tipo.Equals("D")).Sum(n => n.valor);

    esta dando erro pq nao tem valores no banco referente a esta condição, no sql posso usar o coalesce para retornar uma condição diferente de nulo, mas como posso fazer isso no linq?

    Desde já agradeço.

    domingo, 22 de janeiro de 2012 01:30

Respostas

  • Olá Thiago,

     

    tente com LINQ, assim:

    decimal debito = (from p in lista
    				where p.tipo.Equals("D")
    				select p.Valor ?? 0).Sum();
    

    Neste exemplo eu te mostrei o comando ??, chamado null coalescing. Fazendo isso eu estou mandando retornar o Valor diferente de nulo ou 0.


    Pedro Henrique B. Fernandes
    MCTS - .NET Framework 4, Data Access
    MCTS - .NET Framework 4, Web Applications
    Site: pedrofernandes.net
    • Sugerido como Resposta José Eduardo Castro domingo, 22 de janeiro de 2012 23:35
    • Marcado como Resposta Thiago_Porto segunda-feira, 23 de janeiro de 2012 23:43
    domingo, 22 de janeiro de 2012 19:11

Todas as Respostas

  •  

    Thiago

    tenda desta forma, acredito que possa resolver o seu problema

    decimal debito = lista.Where(n => n.tipo.Equals("D")).Sum(n => n.valor== null ? 0 : convertTo.Int32(n.valor));

    boa sorte ai amigão


    Herbert Agles
    Se a resposta contribuiu com a sua necessidade, não se esqueça de marcá-la, assim você beneficiará outros usuários. Sua dúvida também pode ser as de outros!
    domingo, 22 de janeiro de 2012 15:57
  • continuo dando erro 

     

    The cast to value type 'Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

    decimal debito  = lista.Where(n => n.tipo.Equals("D")).Sum(n => n.valor == null ? 0 : n.valor);

    se eu colocar da forma como vc me mandou da esse erro

    LINQ to Entities does not recognize the method 'Int32 ToInt32(System.Decimal)' method, and this method cannot be translated into a store expression.


     

    domingo, 22 de janeiro de 2012 16:12
  • Declara a sua variavel DEBITO com aceitando null tambem.

    EX: decimal? debito = null;

     
    decimal? debito = lista.Where(n => n.tipo.Equals("D")).Sum(n => n.valor == null ? 0 : Convert.ToInt32(n.valor));

     

    eu escrevi errado nao é desta forma convertTo.Int32(n.valor)); mas sim desta forma Convert.ToInt32(n.valor));

    nao esque de declarar a sua variavel aceitando valores null

    veja a Sintax

    decimal? debito = null;

     

     


    Herbert Agles
    Se a resposta contribuiu com a sua necessidade, não se esqueça de marcá-la, assim você beneficiará outros usuários. Sua dúvida também pode ser as de outros!
    domingo, 22 de janeiro de 2012 17:27
  • Olá Thiago,

     

    tente com LINQ, assim:

    decimal debito = (from p in lista
    				where p.tipo.Equals("D")
    				select p.Valor ?? 0).Sum();
    

    Neste exemplo eu te mostrei o comando ??, chamado null coalescing. Fazendo isso eu estou mandando retornar o Valor diferente de nulo ou 0.


    Pedro Henrique B. Fernandes
    MCTS - .NET Framework 4, Data Access
    MCTS - .NET Framework 4, Web Applications
    Site: pedrofernandes.net
    • Sugerido como Resposta José Eduardo Castro domingo, 22 de janeiro de 2012 23:35
    • Marcado como Resposta Thiago_Porto segunda-feira, 23 de janeiro de 2012 23:43
    domingo, 22 de janeiro de 2012 19:11
  • aqui não deu certo, o que poderá ser?

    no VS da essa mensagem:

    Error 1 Operator ‘??’ cannot be applied to operands of type ‘decimal’ and ‘int’ C:\Sites em Desenvolvimento\EF.CasaPlacas\EF.CasaPlacas.Web\SaldoCaixa.aspx.cs 37 49 EF.CasaPlacas.Web

    segunda-feira, 23 de janeiro de 2012 01:37