I need help to transform this SQL into a LINQ

Asked

Viewed 64 times

3

I have the following SQL:

    select conferencia.tb_conferencia.con_codigo,
       con_pedido,
       count(coi_codigo) as countItens,
       count(distinct cic_conferencia_item) as countItensConferidos
  from conferencia.tb_conferencia
  left join conferencia.tb_conferencia_item on (conferencia.tb_conferencia_item.coi_conferencia = conferencia.tb_conferencia.con_codigo)
  left join conferencia.tb_conferencia_item_conferido on (conferencia.tb_conferencia_item.coi_codigo = conferencia.tb_conferencia_item_conferido.cic_conferencia_item)
  where con_codigo = 44
    and con_deletado = 0
  group by con_codigo, con_pedido

where the result is:

Result SQL

Which is my expected result, but I would like to return this query by Entity Framework using LINQ and I cannot get the same result in any way.

EDIT:

Models Pedidos:

[Table("tb_conferencia", Schema = "conferencia")]
public class conferenciaConferencia
    : ModelBase, IValidatableObject
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int con_codigo { get; set; }
    [ForeignKey("vendasPedido"), Required(ErrorMessage = "Informe o código do pedido.")]
    public int? con_pedido { get; set; }
    [Required(ErrorMessage = "informe o número do lote.")]
    public int? con_lote { get; set; }
    public SimNao con_deletado { get; set; }
    [Timestamp]
    public byte[] con_rowversion { get; set; }

    public vendasPedido vendasPedido { get; set; }
}

[Table("tb_conferencia_item", Schema = "conferencia")]
public class conferenciaConferenciaItem
    : ModelBase, IValidatableObject
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int coi_codigo { get; set; }
    [ForeignKey("conferenciaConferencia"), Required(ErrorMessage = "Informe o código da conferência.")]
    public int? coi_conferencia { get; set; }
    [ForeignKey("vendasPedidoItem"), Required(ErrorMessage = "Informe o código do item.")]
    public int? coi_item { get; set; }
    public decimal coi_quantidade { get; set; }
    public SimNao coi_deletado { get; set; }
    [Timestamp]
    public byte[] coi_rowversion { get; set; }

    public conferenciaConferencia conferenciaConferencia { get; set; }
    public vendasPedidoItem vendasPedidoItem { get; set; }
}

[Table("tb_conferencia_item_conferido", Schema = "conferencia")]
public class conferenciaConferenciaItemConferido
    : ModelBase, IValidatableObject
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int cic_codigo { get; set; }
    [ForeignKey("conferenciaConferenciaItem"), Required(ErrorMessage = "Informe o código do item da conferência.")]
    public int? cic_conferencia_item { get; set; }
    [Required(ErrorMessage = "Informe a quantidade conferida.")]
    public decimal cic_quantidade { get; set; }
    [ForeignKey("comunsMaterialEmbalagem"), Required(ErrorMessage = "Informe o código da embalagem do material.")]
    public int? cic_material_embalagem { get; set; }
    public SimNao cic_deletado { get; set; }
    [Timestamp]
    public byte[] cic_rowversion { get; set; }

    public conferenciaConferenciaItem conferenciaConferenciaItem { get; set; }
    public comunsMaterialEmbalagem comunsMaterialEmbalagem { get; set; }
}
  • Gustavo, I performed an EDIT of the issue with the requested information, since I thank you for the attention.

1 answer

3


I managed to solve guys, I’ll leave here in case someone needs to take something as an example..

Thank you...

    var Conferencia = (from Conferencia_Tb_conferencia in db.conferenciaConferencias
                       join Conferencia_Tb_conferencia_item in db.conferenciaConferenciaItens on new { coi_conferencia = (int?)Conferencia_Tb_conferencia.con_codigo } equals new { coi_conferencia = Conferencia_Tb_conferencia_item.coi_conferencia } into Conferencia_Tb_conferencia_item_join
                       from Conferencia_Tb_conferencia_item in Conferencia_Tb_conferencia_item_join.DefaultIfEmpty()
                       join Conferencia_Tb_conferencia_item_conferido in db.conferenciaConferenciaItemConferidos on new { coi_codigo = (int?)Conferencia_Tb_conferencia_item.coi_codigo } equals new { coi_codigo = Conferencia_Tb_conferencia_item_conferido.cic_conferencia_item } into Conferencia_Tb_conferencia_item_conferido_join
                       from Conferencia_Tb_conferencia_item_conferido in Conferencia_Tb_conferencia_item_conferido_join.DefaultIfEmpty()
                       where
                         Conferencia_Tb_conferencia.con_codigo == codConferencia &&
                         Conferencia_Tb_conferencia.con_deletado == SimNao.nao &&
                         Conferencia_Tb_conferencia_item.coi_deletado == SimNao.nao
                       group new { Conferencia_Tb_conferencia, Conferencia_Tb_conferencia_item, Conferencia_Tb_conferencia_item_conferido } by new
                       {
                           Conferencia_Tb_conferencia.con_codigo,
                           Conferencia_Tb_conferencia.con_pedido
                       } into g
                       select new
                       {
                           con_codigo = (int?)g.Key.con_codigo,
                           g.Key.con_pedido,
                           countItens = g.Select(s => s.Conferencia_Tb_conferencia_item.coi_codigo).Distinct().Count(),
                           countItensConferidos = g.Select(s => new { s.Conferencia_Tb_conferencia_item_conferido.cic_conferencia_item, s.Conferencia_Tb_conferencia_item }).
                                                    Distinct().
                                                    Count(p => p.Conferencia_Tb_conferencia_item.coi_codigo == p.cic_conferencia_item && 
                                                               p.Conferencia_Tb_conferencia_item.coi_quantidade == g.Where(w => w.Conferencia_Tb_conferencia_item_conferido.cic_deletado == SimNao.nao && 
                                                                                                                                w.Conferencia_Tb_conferencia_item_conferido.cic_conferencia_item == p.Conferencia_Tb_conferencia_item.coi_codigo).
                                                                                                                     Sum(sum => sum.Conferencia_Tb_conferencia_item_conferido.cic_quantidade))
                       });

Browser other questions tagged

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