Inner Join no entityframework

Asked

Viewed 1,074 times

3

I need to do an Inner Join on Entity frameworkm in the bank, I can do normally this way:

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

But in the Entity framework I can not, it does not show the table to do include.

Here’s how it is currently:

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

I need to make the Products table Inner Join with the table Productssempresas. I tried to make with Include, but it does not show the table to put. I do 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; }
}
  • 1

    Can you post the code of your Products and Products organizations? If you’ve done the relationship between them maybe you don’t even need the include.

  • @Georgewurthmann updated the question with Products and Products.

  • 1

    Missing the reference property in Product Marketing. http://www.entityframeworktutorial.net/entity-relationships.aspx

  • https://docs.microsoft.com/pt-br/ef/ef6/fundamentals/relationships

2 answers

3

The RU has a method called Join.

Look at the 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();
  • It didn’t work, he didn’t accept this part pe.ProdutoID, so I did like this: var resultado = db.Produtos&#xA; .Join(db.ProdutosEmpresas, pe => pe.Id, (p, pe) => new { Produto = p, ProdutoEmpresa = pe })&#xA; .Where(x => x.Produto.ControleEstoque == true)&#xA; .OrderBy(x => x.Produto.Codigo)&#xA; .ToList(); but also did not work, it gives the following error: Gravity Code Description Project File Line Deletion Status Error CS1501 No overhead for "Join" method takes 3 arguments

  • 1

    you are using which version of the Entity Framework?

  • Version 2.1.1 Entityframeworkcore.

3


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

You can do this by adding the following line to the Products:

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

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 entity Product add the line:

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

Doing this to the Estate Produtos of ProdutosEmpresas would be carried by Lazy Loading.

  • It worked out, thank you, That’s the way I really wanted it.

Browser other questions tagged

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