动态EF Where子句引发ArgumentNullException

时间:2013-09-03 18:30:55

标签: c# linq entity-framework

我正在尝试编写一个方法,在给定某些属性值的类中,返回一个已过滤的DbSet。到目前为止,代码是:

    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();
        } 

问题是:每当其中一个属性填充一些值(即:this.Filtro.Nome =“test”)时,ToList()就会引发一个ArgumentNullExcpetion。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你不应该在每一行的末尾强制转换为DbSet。 另外,声明

IQueryable<Pesquisa> temp = db.Pesuisas;

// your code follows.

其背后的原因是,尽管您从DbSet开始,但应用运算符会更改其类型。然后,您的动态转换返回null。