Marcelo Myara
Marcelo Myara

Reputation: 3011

Dynamic EF Where Clause raising ArgumentNullException

I'm trying to code a method that, in it's class given the values of some of the attributes, returns a filtered DbSet. The code, so far, is:

    public IEnumerable<Pesquisa> Pesquisas { 
        get {
            PrometheusDBContext db = new PrometheusDBContext();
            var temp = db.Pesquisas;

            if ((this.Filtro.Nome != null) && (this.Filtro.Nome.Trim() != ""))
            {
                temp = (temp.Where(p => SqlFunctions.PatIndex(this.Filtro.Nome, p.Nome) > 0) as DbSet<Pesquisa>);
            }

            if ((this.Filtro.CodTipoPesquisa != null) && (this.Filtro.CodTipoPesquisa.Trim() != ""))
            {
                temp = (temp.Where(p => p.CodTipoPesquisa == this.Filtro.CodTipoPesquisa.Trim()) as DbSet<Pesquisa>);
            }

            if ((this.Filtro.IDStatusPesquisa != null) && (this.Filtro.IDStatusPesquisa > 0))
            {
                temp = (temp.Where(p => p.IDStatusPesquisa == this.Filtro.IDStatusPesquisa) as DbSet<Pesquisa>);
            }

            if ((this.Filtro.DataCriacao_Inicial != null) && (this.Filtro.DataCriacao_Final != null))
            {
                temp = (temp.Where(p => (p.DataCriacao >= this.Filtro.DataCriacao_Inicial) && (p.DataCriacao <= this.Filtro.DataCriacao_Final)) as DbSet<Pesquisa>);
            }
            else 
            {
                if (this.Filtro.DataCriacao_Inicial != null)
                {
                    temp = (temp.Where(p => p.DataCriacao >= this.Filtro.DataCriacao_Inicial) as DbSet<Pesquisa>);
                }
                if (this.Filtro.DataCriacao_Final != null)
                {
                    temp = (temp.Where(p => p.DataCriacao <= this.Filtro.DataCriacao_Final) as DbSet<Pesquisa>);
                }
            }

            return temp
                .Include(p => p.Usuario)
                .Include(p => p.StatusPesquisa)
                .Include(p => p.TipoPesquisa)
                .Include(p => p.ModeloTermoAdesao)
                .Include(p => p.Pacientes)
                .ToList();
        } 

Problem is: everytime one of the attributes is filled with some value (i.e.: this.Filtro.Nome = "test" ), the ToList() raises an ArgumentNullExcpetion. Any ideas?

Upvotes: 0

Views: 134

Answers (1)

Wiktor Zychla
Wiktor Zychla

Reputation: 48230

You shouldn't cast to DbSet at the end of each line. Also, declare

IQueryable<Pesquisa> temp = db.Pesuisas;

// your code follows.

The reason behind it is that although you start with a DbSet, applying operators changes its type. Your dynamic cast returns null then.

Upvotes: 2

Related Questions