none
C# windows forms Joins Com a Linq RRS feed

  • Pergunta

  • Ola, alguem sabe onde pegar exemplos de Joins com a Linq?
    Quero fazer algo simples

                using (DataLinqDataContext db = new DataLinqDataContext())
                {
                    var q =
                        from e in db.Cad_Cidades
                        join o in db.Cad_Estados on e equals o.Codigo into NomeEstado
                        from o in NomeEstado.DefaultIfEmpty()
                        select new { e.Nome, e.cod_Pais, NomeEst = o };
                    string nomeCidade = q["Nome"];     //Aqui naum to sabendo como usar
                    string nomeEstado = q["NomeEst"];
                }
    E numa outra situação pegar o codigo do Pais na tabela estado e trazer seu nome, tudo numa mesma instrução e trazer todos os registros de todas as tabelas, cidade, estado e pais.

    o que no SQL server ficaria assim:
    SELECT     dbo.Cad_Cidade.Codigo, dbo.Cad_Estado.Codigo AS CodigoEstado, dbo.Cad_Pais.Codigo AS CodigoPais, dbo.Cad_Cidade.Nome,
                          dbo.Cad_Cidade.DDD, dbo.Cad_Cidade.Cod_Estado, dbo.Cad_Cidade.Cod_Pais, dbo.Cad_Estado.Nome AS NomeEstado, dbo.Cad_Estado.Pais,
                          dbo.Cad_Estado.sigla, dbo.Cad_Pais.Nome AS NomePais, dbo.Cad_Pais.DDI, dbo.Cad_Pais.Sigla AS SiglaPais
    FROM         dbo.Cad_Pais RIGHT OUTER JOIN
                          dbo.Cad_Estado ON dbo.Cad_Pais.Codigo = dbo.Cad_Estado.Cod_Pais RIGHT OUTER JOIN
                          dbo.Cad_Cidade ON dbo.Cad_Estado.Codigo = dbo.Cad_Cidade.Cod_Estado

    Sera possivel fazer isso com Linq?

    • Movido AndreAlvesLimaModerator quinta-feira, 25 de fevereiro de 2010 12:08 Migrado de WinForms e Smart Client (De:Windows Forms & Smart Client)
    quinta-feira, 25 de fevereiro de 2010 10:22

Respostas

  • Clodoaldo, o listview não é um dataset.

    Se você está querendo popular por exemplo um listbox, faça através de um foreach da sua coleção. Usando o exemplo que passei na post anterior:

    foreach var dados in pedidos
    {
    ListBox1.Items.Add("dados");
    ListBox1.Items.Add("------"); //  insere uma linha pontilhada entre os items, mas isso ja ficaria a seu carater
    }

    terça-feira, 2 de março de 2010 01:38

Todas as Respostas

  • Prezado,

    Estou migrando seu post para o fórum de LINQ.

    Por favor, da próxima vez que tiver alguma dúvida relacionada a esse assunto, poste por lá.

    Obrigado!
    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quinta-feira, 25 de fevereiro de 2010 12:08
    Moderador
  • Prezado,

    Dê uma olhada no conteúdo deste link:

    http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

    Na minha opinião, tem os melhores exemplos de LINQ todos num só lugar... Passagem obrigatória pra quem está aprendendo LINQ...

    Nele tem uma seção que trata só de JOINS (Join Operators)... Acredito que você vai conseguir resolver seu problema com esses exemplos...
    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quinta-feira, 25 de fevereiro de 2010 12:11
    Moderador
  • Ola, vi inclusive o codigo q eu coloquei aqui éde la modificado para meu caso, sera q tem solução?
    quinta-feira, 25 de fevereiro de 2010 15:54
  • Prezado,

    Como a sentença vai retornar mais de um registro, você precisa percorrê-los, utilizando um foreach...

    Seria algo como:

    var q =
        from e in db.Cad_Cidades
        join o in db.Cad_Estados on e equals o.Codigo into NomeEstado
        from o in NomeEstado.DefaultIfEmpty()
        select new { e.Nome, e.cod_Pais, NomeEst = o };
    
    foreach (var registro in q)
    {
        string nomeCidade = q.Nome;
        string nomeEstado = q.NomeEst;
    }
    

    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quinta-feira, 25 de fevereiro de 2010 20:55
    Moderador
  • O guri obrigado por retornar,  veja só imagina uma tabela de Nota fiscal ou de algum outro documento com muitos campos e vc precisa listar toda a tabela( e.Nome, e.cod_Pais, e.campo, e .campo1, e......) minha pergunta...
    não tem como fazer um "tabela.*" ????    e se na tabela da junção vc precisar de mais campos neste caso do Nome e programador precisar da sigla e outro campo qualquer?


    obrigado

    quinta-feira, 25 de fevereiro de 2010 23:02
  • Clodoalvo, 

    Crie um dataset e preencha ele dessa maneira que o Andre disse, através de um foreach.
    sábado, 27 de fevereiro de 2010 22:02
  • O Leo tem um exemplo ai de como criar um dataset?

    Seria mais ou menos como fazer uma tabela temporaria no SqlServer?
    sábado, 27 de fevereiro de 2010 22:56
  • Não, dataset são classes para manipulação de banco de dados. Dentro de um form, o datagridview por exemplo parece um grid do Excel.

    Você joga um datagridview no form, e atribui à ele os dados da consulta com LINQ.

    Exemplo:

    private void CarregarPedidos()
    {
      var pedidos = from c in nwind.Customers
                           join p in nwind.Orders on
                           c.CustomerID equals p.CustomerID
                           where c.CompanyName == textBox1.Text
                           select new { p.OrderID, p.OrderDate, p.RequiredDate};
    
      DataGridView1.DataSource = pedidos;
    
    }

    No seu caso, você só precisa atribuir a sua coleção genérica como DataSource do DataGridView

    sábado, 27 de fevereiro de 2010 23:26
  • Obrigado por responder, sem querer abusar ja aproveitando o topico como ficaria numa listview?
    nao achei a propriedade datasource nela


    abs

    segunda-feira, 1 de março de 2010 00:38
  • Clodoaldo, o listview não é um dataset.

    Se você está querendo popular por exemplo um listbox, faça através de um foreach da sua coleção. Usando o exemplo que passei na post anterior:

    foreach var dados in pedidos
    {
    ListBox1.Items.Add("dados");
    ListBox1.Items.Add("------"); //  insere uma linha pontilhada entre os items, mas isso ja ficaria a seu carater
    }

    terça-feira, 2 de março de 2010 01:38