Formatting with UNION and LINQ in C #

2

I'm using the following code to bring a list of companies with the CNPJ formatted into the DataGridView:

dgv.DataSource = db.pessoajuridica
                   .Select(d => new { d.idPessoa, d.nome, d.cnpj })
                   .AsEnumerable()
                   .Select(c => new { IdPessoa = c.idPessoa, Razão = c.nome, CNPJ = Convert.ToUInt64(c.cnpj).ToString(@"00\.000\.000\/0000\-00") })
                   .ToList();

And I'm using the following code to bring a list of individuals and corporations to the DataGridView:

dgv.DataSource = db.pessoajuridica
                   .Select(m => new { IdCliente = m.idPessoa, Nome = m.nome, Tipo = "Pessoa Jurídica", Documento = m.cnpj })
                   .Concat(db.pessoafisica
                   .Select(m => new { IdCliente = m.idPessoa, Nome = m.nome,  Tipo = "Pessoa Física", Documento = m.cpf }))
                   .ToList();

But I would like this second option also to come with the format, one specific to the CNPJ and one specific to the CPF. But it's not working ...

The classes are defined as follows:

[Table("pessoa")]
public class pessoa
{
    [Key]
    public int idPessoa { get; set; }

    [Required]
    [StringLength(90)]
    public string nome { get; set; }
}


[Table("pessoafisica")]
public class pessoafisica : pessoa
{

    [StringLength(11)]
    public string cpf { get; set; }

    [StringLength(20)]
    public string rg { get; set; }

}


[Table("pessoajuridica")]
public class pessoajuridica : pessoa
{

    [StringLength(15)]
    public string cnpj { get; set; }

    [StringLength(255)]
    public string nomeFantasia { get; set; }

}

Does anyone know how I could do it?

Thanks!

    
asked by anonymous 19.03.2016 / 16:56

3 answers

0

Thanks to everyone, but I found the solution.

In the parent class, I added a virtual attribute:

[Table("pessoa")]
public class pessoa
{
    [Key]
    public int idPessoa { get; set; }

    [Required]
    [StringLength(90)]
    public string nome { get; set; }

    [NotMapped]
    public virtual string documento { get; set; }
}

And I gave an override of this attribute in the child classes:

[Table("pessoafisica")]
public class pessoafisica : pessoa
{

    [StringLength(11)]
    public string cpf { get; set; }

    [StringLength(20)]
    public string rg { get; set; }

    [NotMapped]
    public override string documento
    {
        get
        {
            return Convert.ToUInt64(cpf).ToString(@"000\.000\.000\-00");
        }
    }
}

[Table("pessoajuridica")]
public class pessoajuridica : pessoa
{

    [StringLength(15)]
    public string cnpj { get; set; }

    [StringLength(255)]
    public string nomeFantasia { get; set; }

    [NotMapped]
    public override string documento
    {
        get
        {
            return Convert.ToUInt64(cnpj).ToString(@"00\.000\.000\/0000\-00");
        }
    }
}

Clean, simple and functional! It's the solution for anyone who needs a day!

    
14.05.2016 / 19:11
1

In this type of case I believe that creating a specific type will solve, just make the desired formatting within the property set.

A very basic example of how to do this:

public class ResultadoPessoa
{
    private string _documento;

    public int IdCliente { get; set; }
    public string Nome { get; set; }
    public string Tipo { get; set; }

    public string Documento
    {
        get { return this._documento; }
        set
        {
            switch (this.Tipo)
            {
                case "Pessoa Jurídica":

                    this._documento = Convert.ToUInt64(value).ToString(@"00\.000\.000\/0000\-00");
                    break;

                case "Pessoa Física":

                    this._documento = Convert.ToUInt64(value).ToString(@"000\.000\.000\-00");
                    break;

                default:
                    this._documento = value;
                    break;
            }
        }
    }
}

In this way, your query would look like:

dgv.DataSource = db.PessoaJuridica.AsQueryable()
                                  .Select(m => new ResultadoPessoa { IdCliente = m.IdPessoa, Nome = m.Nome, Tipo = "Pessoa Jurídica", Documento = m.Cnpj })
                                  .Concat(db.PessoaFisica.AsQueryable()
                                  .Select(m => new ResultadoPessoa { IdCliente = m.IdPessoa, Nome = m.Nome, Tipo = "Pessoa Física", Documento = m.Cpf }))
                                  .ToList();
    
20.03.2016 / 05:50
1

I would do this as follows ..

protected void Page_Load(object sender, EventArgs e)
{
    using (var Db = new WdbContext())
    {
        GridView1.DataSource =  Db.pessoa
            .Vw_PessoaTipos(Db)
            .ToList();

        GridView1.DataBind();
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WApp.Classes.Banco
{
    public class PessoaTipos
    {
        public rpessoa pessoa { get; set; }
        public rpessoafisica pessoafisica { get; set; }
        public rpessoajuridica pessoajuridica { get; set; }

        public String Documento
        {
            get { return pessoafisica.IdPessoaFisica > 0 ? pessoafisica.cpf : pessoajuridica.cnpj; }

        }

        public String Tipo
        {
            get { return pessoafisica.IdPessoaFisica > 0 ? "Pessoa Física" : "Pessoa Jurídica"; }
        }
    }

    public static class PessoaExt
    {
        public static IQueryable<PessoaTipos> Vw_PessoaTipos(
          this IQueryable<rpessoa> qrIn, WdbContext ctx)
        {
            return qrIn.
                Select(P => new PessoaTipos
                {
                    pessoa = P,
                    pessoafisica = ctx.pessoafisica.FirstOrDefault(PF => PF.IdPessoa == P.IdPessoa),
                    pessoajuridica = ctx.pessoajuridica.FirstOrDefault(PJ => PJ.IdPessoa == P.IdPessoa),
                });
        }
    }
}
    
20.03.2016 / 15:11