none
Count em uma das colunas com Linq RRS feed

  • Discussão Geral

  • Bom dia a todos!

    Estou realizando uma select e minha fonte de dados é uma planilha Excel, até ai tudo bem, consigo extrair a maioria das informações necessárias! 

    O meu problema é que em uma das colunas me trás vários itens e soh queria que retornasse a quantidade de produtos!

    Segue o resultado da minha consulta!

    SANTOS   BSE0162514   TEREOS COM SA   CAP CORTES   0634KE   NULL   20FF   TEREOS COM SA   CNB   124   1
    SANTOS BSE0162514 TEREOS COM SA CAP CORTES 0634KE NULL 20ST TEREOS COM SA CNB 124 1
    SANTOS BSE0162514 TEREOS COM SA CAP CORTES 0634KE NULL 40HC TEREOS COM SA CNB 124 1

    Gostaria que me retornasse na coluna onde me trás os seguintes resultados 20FF, 20ST, 40HC a informação 3!

    Assim

    SANTOS  BSE0162514  TEREOS COM SA  CAP CORTES  0634KE  NULL  3  TEREOS COM SA  CNB  124  1

    Eu sei que é necessário usar o Count() mais como utilizaria com linq?

    Segue o meu método que estou utilizando

    public void CarregarBooking()
            {
                OleDbConnection conexao = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\marciosilva\Desktop\Armadores\Booking55.xls;Extended Properties='Excel 12.0 Xml;HDR=YES';");
    
                OleDbDataAdapter adapter = new OleDbDataAdapter("select distinct [BKH - Loading Port (POL) Name],[BKH - Booking Ref], [PARD - Full Name (Decidy)],[BKH - Vessel Name],[BKH - Voyage Ref],[BKD - Cargo Temperature],[BKD - Package],[BKH - Booking Party Name],'CNB' as [ARMADOR],  '124' AS [ARM_ID], '1' AS [CARG_ID] from [Page1_1$] where [BKH - Loading Port (POL) Name] = 'SANTOS' AND ([BKH - Booking Ref] = 'BSE0162514')", conexao);
    
                DataSet ds = new DataSet();
                List<IntegracaoInfo> listaSaida = new List<IntegracaoInfo>();
                try
                {
                    conexao.Open();
                    adapter.Fill(ds);
    
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
    
                        IntegracaoInfo integracao = new IntegracaoInfo();
    
                        integracao.PORTO_CARREG = Convert.ToString(linha["BKH - Loading Port (POL) Name"]);
                        integracao.BKG_NUMERO = Convert.ToString(linha["BKH - Booking Ref"]);
                        integracao.ARMADOR = Convert.ToString(linha["ARMADOR"]);
                        integracao.ARM_ID = Convert.ToString(linha["ARM_ID"]);
                        integracao.CLIENTE = Convert.ToString(linha["PARD - Full Name (Decidy)"]);
                        integracao.NAVIO = Convert.ToString(linha["BKH - Vessel Name"]);
                        integracao.VIAGEM = Convert.ToString(linha["BKH - Voyage Ref"]);
                        integracao.PORTO_DEST = Convert.ToString(linha["BKH - Loading Port (POL) Name"]).Split(',').FirstOrDefault();
                        integracao.PORTO_DEST_PAIS = Convert.ToString(linha["BKH - Loading Port (POL) Name"]).Split(',').LastOrDefault();
                        integracao.CARG_ID = Convert.ToString(linha["CARG_ID"]);
                        integracao.BKG_TEMP = Convert.ToString(linha["BKD - Package"]);
                        integracao.BKG_EXPORTADOR = Convert.ToString(linha["BKH - Booking Party Name"]);  
    
                        //IntegracaoBLL obj = new IntegracaoBLL();
                        
    
                        listaSaida.Add(integracao);
    
    
                        var teste = (from i in listaSaida                                  
    
                                     select i);
    
                        GridView2.DataSource = teste;
                        GridView2.DataBind();
                    }
    
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Erro ao acessar os dados: " + ex.Message);
                }
                finally
                {
                    conexao.Close();
    
                }
    
    
            }

    O campo que é para realizar o Count é integracao.BKG_TEMP!

    o problema é que não posso utilizar Group by porque o resultado é 44 referentes as 44 linhas da base de dados referentes a condição

    WHERE        ([BKH - Loading Port (POL) Name] = 'SANTOS') AND ([BKH - Booking Ref] = 'BSE0162514')

    E também vou remover a condição

    AND ([BKH - Booking Ref] = 'BSE0162514')

    no caso tenho que trazer Count() para cada grupo do [BKH - Booking Ref]  que são varios

    no caso como no exemplo que enviei anteriormente

    SANTOS  BSE0162514  TEREOS COM SA  CAP CORTES  0634KE  NULL  3  TEREOS COM SA  CNB  124  1

    Desde já muito obrigado!



    • Tipo Alterado Marcos SJ quinta-feira, 14 de abril de 2016 17:46 How to
    quinta-feira, 14 de abril de 2016 14:38

Todas as Respostas

  • tente isto:

     var teste = (from i in listaSaida
    
                             select i).ToList();
    
                int c = teste.Select(d => d.BKG_TEMP).Count();

    quinta-feira, 14 de abril de 2016 16:11
  • Boa tarde Hawk

    Obrigado pelo retorno!

    Mais como eu atribuo agora para sair esse resultado

    SANTOS  BSE0162514  TEREOS COM SA  CAP CORTES  0634KE  NULL  3  TEREOS COM SA  CNB  124  1

    no meu GridView?

    Lembrando que a coluna BKG_TEMP é a coluna com o valor 3, mais preciso que traga a linha inteira!

    Desde já muito obrigado

    quinta-feira, 14 de abril de 2016 16:50
  • vc quer que retorne a linha?

    se for isso... na lista tem o objeto e cada objeto deve estar representando os registros da planilha (linhas)...

    é isso?

    quinta-feira, 14 de abril de 2016 17:46
  • Isso mesmo quero que retorne a linha!

    Gostaria que me retornasse na coluna onde me trás os seguintes resultados 20FF, 20ST, 40HC a informação 3!

    Desse jeito

    SANTOS  BSE0162514  TEREOS COM SA  CAP CORTES  0634KE  NULL  3  TEREOS COM SA  CNB  124  1

    o problema é que não posso utilizar Group by porque o resultado é 44 referentes as 44 linhas da base de dados referentes a condição

    WHERE        ([BKH - Loading Port (POL) Name] = 'SANTOS') AND ([BKH - Booking Ref] = 'BSE0162514')

    E também vou remover a condição

    AND ([BKH - Booking Ref] = 'BSE0162514')

    no caso tenho que trazer Count() para cada grupo do [BKH - Booking Ref]  que são varios

    no caso como no exemplo que enviei anteriormente e retornar a linha a baixo!

    SANTOS  BSE0162514  TEREOS COM SA  CAP CORTES  0634KE  NULL  3  TEREOS COM SA  CNB  124  1

    Desde já muito obrigado!




    • Editado Marcio Camargo quinta-feira, 14 de abril de 2016 18:00 Erro de digitação
    quinta-feira, 14 de abril de 2016 18:00
  • o primeiro código que mandei retorna a quantidade de linhas.. agora complementei com um trecho onde pego o objeto usando o "Select" do lambda... no caso onde diz Campo é o campo do objeto que vc traz e onde diz parametro é uma condição 

    var teste = (from i in listaSaida
    
                             select i).ToList();
    
                int c = teste.Select(d => d.BKG_TEMP).Count();
    
                var objeto = teste.Select(d => d.Campo == parametro).FirstOrDefault();

    lembrando que o FirstOrDefault() traz o primeiro de uma lista que encontrar, caso tenha mais de um item com o mesmo parametro passado





    • Editado Hawk B quinta-feira, 14 de abril de 2016 19:04
    quinta-feira, 14 de abril de 2016 18:55
  • Boa tarde Hawk,

    Obrigado pelo retorno!

    Acho que não estou me expressando muito bem!

    Nessa minha select 

    select distinct [BKH - Loading Port (POL) Name],[BKH - Booking Ref], [PARD - Full Name (Decidy)],[BKH - Vessel Name],[BKH - Voyage Ref],[BKD - Cargo Temperature],[BKD - Package],[BKH - Booking Party Name],'CNB' as [ARMADOR],  '124' AS [ARM_ID], '1' AS [CARG_ID] from [Page1_1$] where [BKH - Loading Port (POL) Name] = 'SANTOS' AND ([BKH - Booking Ref] = 'BSE0162514')

    Adcionei a condição

    where [BKH - Loading Port (POL) Name] = 'SANTOS' AND ([BKH - Booking Ref] = 'BSE0162514')

    Porque nesse caso de exemplo ela me traz somente 3 linhas  e não vou passar nenhum parametro!

    Essa condição não vai existir e essa select vai me trazer algumas milhares de linhas!

    Mais nesse exemplo me traz esse seguinte resultado

    SANTOS  BSE0162514  TEREOS COM SA  CAP CORTES  0634KE  NULL  20FF  TEREOS COM SA  CNB  124  1

    SANTOS  BSE0162514  TEREOS COM SA  CAP CORTES  0634KE  NULL  20ST TEREOS COM SA  CNB  124  1

    SANTOS BSE0162514   TEREOS COM SA  CAP CORTES  0634KE  NULL  40HC TEREOS COM SA  CNB  124  1

    E na coluna BKG_TEMP nessas 3 linhas me trás os seguintes resultados 20FF, 20ST, 40HC  

    Nesse caso quero que realize o count()  e o Distinct e retorne nessa coluna o resultado 3

    O resultado que esperado das 3 linhas !

    SANTOS  BSE0162514  TEREOS COM SA  CAP CORTES  0634KE  NULL  3  TEREOS COM SA  CNB  124  1

    Desde já muito obrigado!


    quinta-feira, 14 de abril de 2016 19:37
  • Bom dia a Todos,

    Depois de quebrar a cabeça, segue a minha solução para o meu problema!

     var  categoryCounts =
                                       from i in listaSaida
                                       group i by i.BKG_NUMERO into g
                                       select new { Category = g.Key, ProductCount = g.Count() };
    
                        var teste = from i in listaSaida
                                     join c in categoryCounts on i.BKG_NUMERO equals c.Category
    
                                     select new {i.PORTO_CARREG, i.BKG_NUMERO, i.ARMADOR, i.ARM_ID, i.CLIENTE, i.NAVIO, i.VIAGEM, i.PORTO_DEST, i.PORTO_DEST_PAIS, i.CARG_ID, BKG_TEMP = c.ProductCount, i.BKG_EXPORTADOR, i.BKG_GWT, i.TIPOCNTR };
    

    Segue o material que usei para consulta!

    https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

    Desde já muito obrigado a todos!

    segunda-feira, 18 de abril de 2016 12:18