Return from sql in text to model in the entity framework

2

I have the parents class and the state class:

[Table("tb_pais")]
    public class PaisModel
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }

        [Column("nome")]
        [Required(ErrorMessage = "O campo nome é obrigatório")]
        public string Nome { get; set; }

        [Column("sigla")]
        [Required(ErrorMessage = "O campo sigla é obrigatório")]
        public string Sigla { get; set; }
}

[Table("tb_estado")]
    public class EstadoModel
    {

        [Key]
        [Column("id")]
        public int Id { get; set; }

        [Column("nome")]
        [Required(ErrorMessage = "O campo nome é obrigatório")]
        public string Nome { get; set; }

        [Column("sigla")]
        [Required(ErrorMessage = "O campo sigla é obrigatório")]
        public string Sigla { get; set; }

        [Column("id_pais")]
        [ForeignKey("Pais")]
        public int IdPais { get; set; }

        public virtual PaisModel Pais { get; set; }
}

Using the following sql and returning the data in the virtual variable PaisModel?

var sql = "SELECT A.id, A.nome, A.sigla, A.id_pais as IdPais from 
 dbo.tb_estado A " +
"INNER JOIN dbo.tb_pais B ON (A.id_pais = B.id) " +
 filtroWhere +
 paginacao;

ret = db.Database.SqlQuery<EstadoModel>(sql).ToList();
    
asked by anonymous 22.08.2018 / 20:19

1 answer

2

Simple example of using Entity Framework (EF) and where dynamic.

Context

public class Conexao : DbContext
{
    public Conexao()
        : base("Conexao")
    {
        Database.SetInitializer<Conexao>(null);
    }

    public DbSet<Pais> Pais { get; set; }
    public DbSet<Estado> Estado { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {            
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

Models

Detail on EF, if the name of the Model property is the same as the name of the column in the database, you do not need to put the identifier Column . The same goes for table.

Parents

[Table("tb_pais")]
public class Pais
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage = "O campo nome é obrigatório")]
    public string Nome { get; set; }

    [Required(ErrorMessage = "O campo sigla é obrigatório")]
    public string Sigla { get; set; }
}

Status

[Table("tb_estado")]
public class Estado
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage = "O campo nome é obrigatório")]
    public string Nome { get; set; }

    [Required(ErrorMessage = "O campo sigla é obrigatório")]
    public string Sigla { get; set; }

    [Column("id_pais")]
    public int IdPais { get; set; }

    [ForeignKey("IdPais")]
    public virtual Pais Pais { get; set; }
}

System.Linq.Dynamic

To add dynamic items from select, where and related you can use 'System.Linq.Dynamic'.

You can install it by nugget link

Example usage

I'll put a simple example to use.

In it is MontaWhere, which mounts where dynamically. The Cidade.Descricao makes the where in the parent class, because the OperacaoLocalidade class has a FK for the CIDADE class.

using site.domain.context; using site.Dominio.DTO; using site. using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Dynamic; using System.Web; using System.Web.Mvc; namespace site.domain.repositories {     public class OperationRepository     {         private Connection db {get; set; }         private UserIDDTO user {get; set; }

    private string MontaWhere()
    {
        var where = String.Format("Apagado = \"N\" and VisaoID == {0}", usuario.VisaoID);
        return where;
    }

    private string MontaWhereFiltro(GridFiltroDTO parametros)
    {
        var where = "";
        if (!String.IsNullOrEmpty(parametros.filtro))
        {
            where += where.SQLWhereInteger("OperacaoLocalidadeID", parametros.filtro);
            where += where.SQLWhereMergeOr("Sigla.ToLower().Contains(@0)");
            where += where.SQLWhereMergeOr("OperacaoLocalidadeUF.Estado.Sigla.ToLower().Contains(@0)");
            where += where.SQLWhereMergeOr("OperacaoLocalidadeUF.Estado.Descricao.ToLower().Contains(@0)");
            where += where.SQLWhereMergeOr("Cidade.Descricao.ToLower().Contains(@0)");
        }
        return where;
    }

    private string MontaWherePessoa(int? pessoa)
    {
        var where = "";
        if (pessoa != null)
        {
            where = String.Format("PessoaID == {0}", pessoa);
        }
        return where;
    }

    private string MontaOrderBy(GridFiltroDTO parametros)
    {
        return String.IsNullOrEmpty(parametros.orderna) ? "Sigla" : parametros.orderna + " " + parametros.ordernaTipo;
    }

    private int TotalDeRegistros(GridFiltroDTO parametros, UsuarioLogadoDTO usuarioLogado)
    {
        return
            db.OperacaoLocalidade
            .Where(MontaWhere())
            .Where(MontaWhereFiltro(parametros), parametros.filtro)
            .Where(MontaWherePessoa(usuarioLogado.PessoaID))
            .Count();
    }

    public GridResultadoDTO Grid(GridFiltroDTO parametros)
    {
        return new GridResultadoDTO(
            db.OperacaoLocalidade
                .Where(MontaWhere())
                .Where(MontaWhereFiltro(parametros), parametros.filtro)
                .Where(MontaWherePessoa(usuario.PessoaID))
                .Select(s => new {
                    s.OperacaoLocalidadeID,
                    s.Pessoa.Nome,
                    s.Sigla,
                    Estado = s.Estado.Descricao,
                    Cidade = s.Cidade.Descricao,
                    s.Status,
                    Fixo = s.Fixo == "S" ? "Sim" : "Não"
                })
                .OrderBy(MontaOrderBy(parametros))
                .Skip(parametros.itensParaIgnorar)
                .Take(parametros.itensPorPagina)                    
                .ToArray(), TotalDeRegistros(parametros, usuario));
    }

    public SelectList ComboBox(int? pessoa) 
    { 
        return 
            new SelectList(
                db.OperacaoLocalidade
                .Where(MontaWhere())
                .Where(MontaWherePessoa(pessoa))
                .OrderBy(o => o.Sigla)
                .Select(s => new ItemComboBoxDTO { Key = s.OperacaoLocalidadeID, Texto = s.Sigla + " [ " + s.Cidade.Descricao + " / " + s.Cidade.Estado.Sigla + " ] " }).ToArray(), 
                "Key", "Texto"); 
    }

    public OperacaoLocalidadeRepositorio(Conexao conexao, UsuarioLogadoDTO usuarioLogado)
    {
        db = conexao;
        usuario = usuarioLogado;
    }
}

}

    
22.08.2018 / 21:47