How to create a custom list using data from four tables?

4

I have the following class:

Nota
{
    int id;
    int idFornecedor;
    int idProduto;
    int idClasse;
}

and I have the respective classes referring to the ids of the previous class:

Fornecedor
{
    int id;
    string descricao;
}

Produto
{
    int id;
    string descricao;
}

Classe
{
    int id;
    string descricao;
}

How do I create a list using Lambda or LINQ that returns me the following result:

NotaCompleta
{
    int id;
    int idFornecedor;
    int idProduto;
    int idClasse;
    string fornecedorDescricao;
    string produtoDescricao;
    string classeDescricao;
}
    
asked by anonymous 11.04.2017 / 13:01

3 answers

5

Follow a query and another # This is just another way to solve. >

Variables to use in LINQ

var notas = new List<Nota>();
var fornecedores = new List<Fornecedor>();
var produtos = new List<Produto>();
var classes = new List<Classe>();

Populating for example

var nota1 = new Nota { id = 1, idFornecedor = 1, idProduto = 1, idClasse = 1 };
var nota2 = new Nota { id = 1, idFornecedor = 1, idProduto = 2, idClasse = 2 };
var fornecedor1 = new Fornecedor { id = 1, descricao = "Fornecedor1" };
var produto1 = new Produto { id = 1, descricao = "Produto1" };
var produto2 = new Produto { id = 2, descricao = "Produto2" };
var classe1 = new Classe { id = 1, descricao = "Classe1" };
var classe2 = new Classe { id = 2, descricao = "Classe2" };

notas.Add(nota1);
notas.Add(nota2);
fornecedores.Add(fornecedor1);
produtos.Add(produto1);
produtos.Add(produto2);
classes.Add(classe1);
classes.Add(classe2);

To use on LAMBDA

var notasQ = new EnumerableQuery<Nota>(notas);
var fornecedoresQ = new EnumerableQuery<Fornecedor>(fornecedores);
var produtosQ = new EnumerableQuery<Produto>(produtos);
var classesQ = new EnumerableQuery<Classe>(classes);

LINQ Query

var NotaCompletaLINQ = from no in notas
                       join fo in fornecedores on no.idFornecedor equals fo.id
                       join pr in produtos on no.idProduto equals pr.id
                       join cl in classes on no.idClasse equals cl.id
                       select new {
                           no.id,
                           no.idFornecedor,
                           no.idProduto,
                           no.idClasse,
                           fornecedorDescricao = pr.descricao,
                           produtoDescricao = pr.descricao,
                           classeDescricao = cl.descricao
                       };

LAMBDA Inquiry

var NotaCompletaLAMBDA = notasQ
    .Join(fornecedoresQ, nota => nota.idFornecedor, forn => forn.id, (nota, forn) => new { nota, forn })
    .Join(produtosQ, nota => nota.nota.idProduto, prod => prod.id, (nota, prod) => new { nota.nota, nota.forn, prod })
    .Join(classesQ, nota => nota.nota.idClasse, clas => clas.id, (nota, clas) => new { nota.nota, nota.forn, nota.prod, clas })
    .Select(x => new {
        x.nota.id,
        x.nota.idFornecedor,
        x.nota.idProduto,
        x.nota.idClasse,
        fornecedorDescricao = x.forn.descricao,
        produtoDescricao = x.prod.descricao,
        classeDescricao = x.clas.descricao
    });

Obs
It was necessary to turn their fields into properties (simplified).

public class Nota {
    public int id { get; set; }
    public int idFornecedor { get; set; }
    public int idProduto { get; set; }
    public int idClasse { get; set; }
}

public class Fornecedor {
    public int id { get; set; }
    public string descricao { get; set; }
}

public class Produto {
    public int id { get; set; }
    public string descricao { get; set; }
}

public class Classe {
    public int id { get; set; }
    public string descricao { get; set; }
}
    
11.04.2017 / 14:58
4

You can use Join with Lambda expressions:

    List<Fornecedor> forecedores = new List<Fornecedor>() 
    {
        new Fornecedor() { id=1, descricao="forn1" },
        new Fornecedor() { id=2, descricao="forn2" },
        new Fornecedor() { id=3, descricao="forn3" },
        new Fornecedor() { id=4, descricao="forn4" }
    };

    List<Produto> produtos = new List<Produto>() 
    {
        new Produto() { id=1, descricao="prod1" },
        new Produto() { id=2, descricao="prod2" },
        new Produto() { id=3, descricao="prod3" },
        new Produto() { id=4, descricao="prod4" }
    };

    List<Classe> classes = new List<Classe>() 
    {
        new Classe() { id=1, descricao="clas1" },
        new Classe() { id=2, descricao="clas2" },
        new Classe() { id=3, descricao="clas3" },
        new Classe() { id=4, descricao="clas4" }
    };

    List<Nota> notas = new List<Nota>() 
    {
        new Nota() { id=1, idFornecedor=1, idProduto=2,idClasse=2},
        new Nota() { id=2, idFornecedor=2, idProduto=3,idClasse=3},
        new Nota() { id=3, idFornecedor=4, idProduto=1,idClasse=1}
    };

    int idNotaCompleta = 1;

    var notasCompletas = 
        from nota in notas
            join produto in produtos on nota.idProduto equals produto.id
            join fornecedor in forecedores on nota.idFornecedor equals fornecedor.id
            join classe in classes on nota.idClasse equals classe.id
            select new NotaCompleta() 
            {
                id = idNotaCompleta++,
                idFornecedor = fornecedor.id,
                idProduto = produto.id,
                idClasse = classe.id,
                fornecedorDescricao = fornecedor.descricao,
                produtoDescricao = produto.descricao,
                classeDescricao = classe.descricao
            };

Example working on .Net Fiddle: link

    
11.04.2017 / 13:59
2

Easier to update your Nota

class Nota
{
    int id;
    Fornecedor Fornecedor;
    Produto Produto;
    Classe Classe;
}

So just use:

var nota = GetNotaPorId(idNota);
var fornecedor = nota.Fornecedor.Descricao;

This would be simpler, since within Fornecedor , Produto and Classe already have id , there would be no reason to duplicate those properties in Nota .

Just using your scenario - but I totally do not recommend it:

var notaCompleta = db.notas.Select(nota => new 
{
    nota.Id,
    nota.IdFornecedor,
    nota.IdProduto,
    nota.Classe,
    FornecedorDescricao = db.Fornecedores.Single(f => f.Id == nota.IdFornecedor).Descricao,
    ProdutoDescricao = db.Produtos.Single(p => p.Id == nota.IdProduto).Descricao,
    ClasseDescricao = db.Classes.Single(c => c.Id == nota.IdClasse).Descricao
}
    
11.04.2017 / 13:49