Inner join in entityframework

3

I need to do an inner join on the entity framework in the database, I can do this normally:

select * from Produtos inner join ProdutosEmpresas on ProdutoID = Produtos.Id

But in the entity framework I can not, it does not appear in the table to do the include.

Here's how it's currently:

var produtos = db.Produtos.OrderBy(a => a.Codigo).Where(a => a.ControleEstoque == true).ToList();

I need to make the inner join of the Products table with the ProductsBusiness table. I tried to do with Include , but it does not show the table to put. I did not understand why.

ProdutosEmpresas

 public class ProdutosEmpresas
{
    [Key]
    public int Id { get; set; }
    public Empresa EmpresaProduto { get; set; }
    public int EmpresaID { get; set; }
    public Produto ProdutoEmpresa { get; set; }
    public int ProdutoID { get; set; }
    public int Qtd { get; set; }
    public decimal PrecoCusto { get; set; }
    [DataType(DataType.Currency)]
    public decimal PrecoVenda { get; set; }
}

Produtos

 public class Produto
{

    [Key]
    public int Id { get; set; }
    [StringLength(100)]
    public string Codigo { get; set; }

    [StringLength(120)]
    public string nome { get; set; }
    public int QtdAtual { get; set; }
    public int QtdMinima { get; set; }
    public int QtdMaxima { get; set; }

    public decimal PrecoCusto { get; set; }
    [DataType(DataType.Currency)]
    public decimal PrecoVenda { get; set; }
    public decimal CustoMedio { get; set; }

    public float ICMS { get; set; }

    public float ISS { get; set; }

    public float IPI { get; set; }
    public float Margem { get; set; }
    public float Comissao { get; set; }
    public int CategoriaID { get; set; }
    public Categoria Categoria { get; set; }
    //public int EmpresaID { get; set; }
    //public Empresa Empresa { get; set; }

    [StringLength(500)]
    public string observacao { get; set; }
    [StringLength(8)]
    public string NCM { get; set; }

    public bool ControleEstoque { get; set; }
    public byte[] Foto { get; set; }

    public bool TipoProduto { get; set; }
    public bool TipoSoftware { get; set; }
}
    
asked by anonymous 14.11.2018 / 12:23

2 answers

3

You can (or even should) specify the relationship between entities.

You can do this by adding the following line in Products Companies:

[ForeignKey("Id")]
public Produtos Produtos { get; set; }

It would look like this:

public class ProdutosEmpresas
{
    [Key]
    public int Id { get; set; }
    public Empresa EmpresaProduto { get; set; }
    public int EmpresaID { get; set; }
    public Produto ProdutoEmpresa { get; set; }
    public int ProdutoID { get; set; }
    public int Qtd { get; set; }
    public decimal PrecoCusto { get; set; }
    [DataType(DataType.Currency)]
    public decimal PrecoVenda { get; set; }

    [ForeignKey("Id")]
    public Produtos Produtos { get; set; }
}

And in the Product entity add the line:

public virtual ICollection<ProdutosEmpresas> { get; set; }

By doing this the Produtos property of ProdutosEmpresas would be loaded by Lazy Loading .

    
14.11.2018 / 13:35
3

EF has a method called Join .

See docs

Your code would look something like this:

ObjectSet<Produto> produtos = db.Produto;
ObjectSet<SProdutosEmpresas> produtosEmpresas = db.ProdutosEmpresas;

var resultado = produtos
    .Join(produtosEmpresas, pe => pe.ProdutoID, (p, pe) => new { Produto = p, ProdutoEmpresa = pe })
    .Where(x => x.Produto.ControleEstoque)
    .OrderBy(x => x.Produto.Codigo)
    .ToList();
    
14.11.2018 / 12:45