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

Asked

Viewed 614 times

4

I have the following class:

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

and I have the respective classes for the previous class ids:

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 the following result:

NotaCompleta
{
    int id;
    int idFornecedor;
    int idProduto;
    int idClasse;
    string fornecedorDescricao;
    string produtoDescricao;
    string classeDescricao;
}

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 be used on the 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 consultation

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
                       };

Consultation LAMBDA

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 transform 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; }
}

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 running on . Net Fiddle: https://dotnetfiddle.net/2uooAR

2

Simpler 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;

That would be the simplest, since inside Fornecedor, Produto and Classe already have id, there would be no reason to duplicate these properties in Nota.

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

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
}
  • tell me one thing, these classes are automatically created via Entity Framework. How can I do the example you mentioned above?

  • 1

    You did reverse engineering then to create the class, right? Which means you did Database First In the opposite sense, you do Code First. Take a look at my Github repository on how to get started with Codefirst. Can help.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.