none
join com linq csharp RRS feed

  • Pergunta

  • Amigos, estou com uma duvida e gostaria de ajuda. 

    estou estudando linq e queria saber como fazer uma pesquisa em 3 tabelas do banco.

    no meu estudo fiz assim, coloquei um texbox ( nome )  e um datagrid abaixo,  quando eu digitar 

     ex. "marcelo" no textbox  , o dg seria preenchido com o resultado de 3 tabelas. 

    grato 

    ricardo.

    terça-feira, 20 de novembro de 2012 19:20

Respostas

  • O codigo fica assim (se vc realmente tem o modelo definido com as 3 tabelas):

    {
    	var prod = from p in dc.tbl_produtos 
    	join entr in dc.tbl_entradas on p.idprodutos equals entr.idproduto
    	join valv in dc.tbl_ValorVenda on p.idprodutos equals valv.idproduto
    	where p.nome.contains(txtproduto.text)
    	select new
    	{p.nome,
    	p.descricao,
    	p.unidade,
    	entr.qtd,
    	valv.ValorVenda
    	};
    }

    att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    quarta-feira, 21 de novembro de 2012 16:58
    Moderador

Todas as Respostas

  • Se o resultado das 3 tabelas for o mesmo, bastaria fazer uma concatenaçao de resultados, equivalente ao UNION sql

    veja um exemplo de concatenaçao de listas aqui:

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

    e procure por concat-2

    ublic void Linq95() 
    { 
        List<Customer> customers = GetCustomerList(); 
        List<Product> products = GetProductList(); 
      
        var customerNames = 
            from c in customers 
            select c.CompanyName; 
        var productNames = 
            from p in products 
            select p.ProductName; 
      
        var allNames = customerNames.Concat(productNames); 
      
        Console.WriteLine("Customer and product names:"); 
        foreach (var n in allNames) 
        { 
            Console.WriteLine(n); 
        } 
    } 

    no exemplo acima ele concatena em uma unica lista os nomes da tabela de produtos e clientes

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    terça-feira, 20 de novembro de 2012 19:26
    Moderador
  • William  obrigado por sua resposta, mas eu não consegui entender. eu teria que criar 3 lists e depois fazer a concatenação ? sem querer abusar vc teria outro exemplo pra me passar. 

    grato ricardo,

    terça-feira, 20 de novembro de 2012 19:38
  • Sim.. Seria essa a ideia.

    Um join nao vai trazer dados de 3 tabelas no sentido qu evc postou.. Um join faz uniao no sentido das colunas e um Union no sentido das linhas.

    Exemplo 3 tabelas (cada uma com dois campos)

    AA

    AA_ID AA_NOME

    1         AANome1

    2         AANome 2

    3         AANome 3

    bb

    BB_ID BB_NOME

    1         BBNome1

    2         BBNome 2

    3         BBNome 3

    CC

    CC_ID CC_NOME

    1         CCNome1

    2         CCNome 2

    3         CCNome 3

    Un join (pelo ID) vai fazer isso:

    ID   AA_NOME   BB_NOME  CC_NOME

    1    AANome1  BBNome1  CCNome1

    2    AANome2  BBNome2  CCNome2

    3    AANome3  BBNome3  CCNome3

    Um union faz isso:

    ID NOME

    1 AANome1

    2 ANome2

    3 ANome3

    1 BBNome1

    2 BBNome2  

    3 BBNome3  

    1 CCNome1

    2 CCNome2

    3 CCNome3

    Dependendo do que vc quiser vai ter que fazer join ou concat.. a vc de responder.

    Att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    terça-feira, 20 de novembro de 2012 20:01
    Moderador
  • Continuo perdido rs, vi alguns exemplos mas não tenho obtido resultado.  postarei o cod . 

    // pesquiso o produto pelo nome e pego o id. 

    public void btnPesq_Click (object sender, eventargs e)

    { var prod = (from p in dc.tbl_produtos where p.nome.contains(txtproduto.text)

    select p.idprodutos).single();

    int IDPROD = convert.toint32(prod);

    var consulta = from i in dc.tbl_produtos join p in dc.tbl_entradas on i.idprodutos equals p.idproduto

    where i.idprodutos == this.IDPROD

    select new {i.NOME, p. qtd };

    }

    quarta-feira, 21 de novembro de 2012 11:49
  • Nao é no codigo que vc tem que focar.. é na sua necessidade..

    Diga para nós o que vc quer fazer, colocando aqui, se possivel , o modelo de dados de cada uma das tabelas. 

    Eu nao posso dizer se seu codigo esta certo ou errado sem saber onde vc quer chegar.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 21 de novembro de 2012 12:11
    Moderador
  • William, obrigado mais uma vez pela sua ajuda. 

    possuo 3 tabelas (produtos) -(entrada) - (valorvenda) as 2 ultimas tem fk (idproduto)  tenho um textbox que recebe uma pesquisa e preenche um datagrid com o resultado dessas 3 tabelas.  no codigo q postei testei o resultado de somente 2 tabelas mas não consegui resultado.

    quarta-feira, 21 de novembro de 2012 12:36
  • Como eu disse.. nós nao conhecemos o seu modelo de dados. Como é que vc espera uma reposta?

    Por exemplo como é que vamos propor uma query sem saber quais sao os campos de ligraçao entre produtos, entrada e calor venda?

    Para facilitas as coisas, use o Excel (ou outro porgrama de planilha como o libroffice, caso nao tenha excel) e poste aqui um screenshot daquilo o que deseja obter, e os modelos de dados das suas tabelas.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 21 de novembro de 2012 13:12
    Moderador
  • William, pretendo obter o resultado dessas 3 tabelas. meu campo de pesquisa é o nome da tbl_produto.

    grato pela ajuda.

    ricardo

    quarta-feira, 21 de novembro de 2012 13:26
  • Ainda nao respondeu a questao fundamental: O que vc quer como resultado!

    Quais campos (e de quais tabelas) vc quer que aparece no grid.

    como eu disse antes.. use o Excel (ou outra planilha) para nos apresentar o que vc quer.. vai ficar muito mais facil te orientar

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 21 de novembro de 2012 14:25
    Moderador
  • William, preciso do popular o meu grid com retorno desses campos em amarelo. 

    grato pela ajuda. 

    ricardo

    quarta-feira, 21 de novembro de 2012 14:38
  • Entao o que na verdade vc quer é o resultado disso:

    Select tbl_produto.nome,tbl_produto.descricao,tbl_produto.unidade,tabela_entrada.qtd, tbl_ValorVenda.ValorVenda
    from   tbl_produto
    inner join tabela_entrada on tabela_entrada.IdProduto=tbl_produto.IdProdutos
    inner join tbl_ValorVenda.ValorVenda on  tbl_ValorVenda.IdProduto=tbl_produto.IdProdutos
    where tbl_produto.nome="Nome de um produto que exista na base"

    Verifique no SQL Server se a consulta acima traz os dados desejados... se for isso mesmo a gente parte para a modelizaçao LINQ

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 21 de novembro de 2012 15:26
    Moderador
  • William , é isso ai. 
    quarta-feira, 21 de novembro de 2012 16:39
  • O codigo fica assim (se vc realmente tem o modelo definido com as 3 tabelas):

    {
    	var prod = from p in dc.tbl_produtos 
    	join entr in dc.tbl_entradas on p.idprodutos equals entr.idproduto
    	join valv in dc.tbl_ValorVenda on p.idprodutos equals valv.idproduto
    	where p.nome.contains(txtproduto.text)
    	select new
    	{p.nome,
    	p.descricao,
    	p.unidade,
    	entr.qtd,
    	valv.ValorVenda
    	};
    }

    att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    quarta-feira, 21 de novembro de 2012 16:58
    Moderador
  • William , muito obrigado pela ajuda. 

    estou carregando o datagrid com o resultado, mas esta me gerando um erro InvalidCastException

    unable to cast object type "system.int32" to type "system.string".

    alguma ideia do que possa estar aconteçendo ?

    grato ricardo

    quarta-feira, 21 de novembro de 2012 17:18
  • É um dos seus campos.. A mensagem é bem clara, vc esta tentanto converter um int32 para string de forma implicita .Como eu disse antes. nao conheço a sua base e nem seus tipos.

    Fica dificil responder.

    Provavelmentente é o "entr.qtd"

    mas nao tenho como ter certeza.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    quarta-feira, 21 de novembro de 2012 18:12
    Moderador
  • William,

    vou verificar as tbls pois testei esta query  com outras tabelas e esta funcionado perfeitamente. 

    agradeço muito pela sua ajuda.

    fique com deus. 

    Ricardo.

    quarta-feira, 21 de novembro de 2012 19:00