INNER JOIN listado en Entity Framework

publicado por: Anonymous

Tengo estas 2 tablas

Tabla Productos

introducir la descripción de la imagen aquí

Tabla Saldos

introducir la descripción de la imagen aquí

Quiero listar la tabla de tal manera que me muestre todo los datos de la primera tabla mas la cantidad de acuerdo al id, lo hice con esta sentencia:

    SELECT Articulos.id, Articulos.nombreProducto, Articulos.Precio, Saldos.Cantidad
      FROM Articulos 
INNER JOIN Saldos ON Articulos.id = Saldos.id

introducir la descripción de la imagen aquí

Estoy tratando de hacer esto mismo pero usando EF en C# pero no me sale, llevo esto pero esta mal

public List<Articulos> listar(){
    var arti = new List<Articulos>();

    try{
        using (var ctx = new ModeloProductos()){
            arti = ctx.Articulos.Include("Saldos")
                                .Include("Saldos.id")
                                .Where(x => x.id == id)
                                .ToList();
        }
    } catch (Exception E) {
        throw;
    }
    return arti;
}

como puedo pasar ese INNER JOIN al EF?

EDITADO
Modelo de la db Productos

namespace PruebaVictorDuarte.Models
{
    using System;
    using System.Data.Entity;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;

    public partial class ModeloProductos : DbContext
    {
        public ModeloProductos()
            : base("name=ModeloProductos")
        {
        }

        public virtual DbSet<Articulos> Articulos { get; set; }
        public virtual DbSet<Bitacora> Bitacora { get; set; }
        public virtual DbSet<Saldos> Saldos { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Articulos>()
                .Property(e => e.nombreProducto)
                .IsUnicode(false);

            modelBuilder.Entity<Articulos>()
                .Property(e => e.Precio)
                .HasPrecision(18, 4);

            modelBuilder.Entity<Articulos>()
                .HasMany(e => e.Bitacora)
                .WithRequired(e => e.Articulos)
                .WillCascadeOnDelete(false);

            modelBuilder.Entity<Articulos>()
                .HasMany(e => e.Saldos)
                .WithRequired(e => e.Articulos)
                .WillCascadeOnDelete(false);

            modelBuilder.Entity<Bitacora>()
                .Property(e => e.Historial)
                .IsUnicode(false);
        }
    }
}

Articulos

namespace PruebaVictorDuarte.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.Data.Entity.Spatial;
    using System.Linq;

    public partial class Articulos
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Articulos()
        {
            Bitacora = new HashSet<Bitacora>();
            Saldos = new HashSet<Saldos>();
        }

        public int id { get; set; }

        [Required]
        [StringLength(50)]
        public string nombreProducto { get; set; }

        public decimal Precio { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Bitacora> Bitacora { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Saldos> Saldos { get; set; }


        /*AGREGA DATOS DEL PRODUCTO A LA TABLA
         Y RECUPERA EL ID INSERTADO*/
        public int addArticulo(string nombre, decimal pp)
        {
            int idCate=0;

            var datos = new Articulos
            {
                nombreProducto = nombre,
                Precio = pp
            };

            using (var ctx = new ModeloProductos())
            {
                ctx.Entry(datos).State = EntityState.Added;
                ctx.SaveChanges();
                idCate = datos.id;
            }

            return idCate;
        }


    }


}

Saldos

namespace PruebaVictorDuarte.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.Data.Entity.Spatial;

    public partial class Saldos
    {
        [Key]
        [Column(Order = 0)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int id { get; set; }

        [Key]
        [Column(Order = 1)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Cantidad { get; set; }

        public virtual Articulos Articulos { get; set; }

        /*ESTABLECE EL SALDO PRIMARIO EN CERO ("0")*/
        public void setSaldo(int sal)
        {
            int saldo = 0;

            var datos = new Saldos
            {
                id=sal,
                Cantidad = saldo
            };

            using(var ctx=new ModeloProductos()){

                ctx.Entry(datos).State = EntityState.Added;
                ctx.SaveChanges();
            } 
        }
    }
}

solución

Para consultas con joins como regresas datos mezclados de tablas no es recomendable que regreses el objeto de una entidad, si no que declares un objeto que contendrá los datos de tu consulta de varias tablas, por ejemplo:

public class ArticuloSaldo
{
    public int Id { get; set; }
    public string NombreProducto { get; set; }
    public decimal Precio { get; set; }
    public int Cantidad { get; set; }
}

Y el query de esta forma que es más parecida a SQL y fácil de entender:

using(var ctx = new ModeloProductos())
{
    var query = from a in ctx.Articulos
                join s in ctx.Saldos on a.id equals s.id
                select new ArticuloSaldo { 
                    Id = a.id, 
                    NombreProducto = a.nombreProducto, 
                    Precio = a.Precio, 
                    Cantidad = s.Cantidad };
    return query.ToList();
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *