C# 引发ArgumentNullException的动态EF Where子句

C# 引发ArgumentNullException的动态EF Where子句,c#,linq,entity-framework,C#,Linq,Entity Framework,我试图编写一个方法,在它的类中给定一些属性的值,返回一个过滤的DbSet。到目前为止,守则是: public IEnumerable<Pesquisa> Pesquisas { get { PrometheusDBContext db = new PrometheusDBContext(); var temp = db.Pesquisas; if ((this.Filtro.Nome

我试图编写一个方法,在它的类中给定一些属性的值,返回一个过滤的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();
        } 
public IEnumerable Pesquisas{
得到{
PROMETHEUDBCONTEXT db=新的PROMETHEUDBCONTEXT();
var temp=分贝比斯基萨斯;
if((this.Filtro.Nome!=null)&&(this.Filtro.Nome.Trim()!=“”)
{
temp=(temp.Where(p=>SqlFunctions.PatIndex(this.Filtro.Nome,p.Nome)>0)作为DbSet);
}
if((this.Filtro.CodTipoPesquisa!=null)和&(this.Filtro.CodTipoPesquisa.Trim()!=“”)
{
temp=(temp.Where(p=>p.CodTipoPesquisa==this.Filtro.CodTipoPesquisa.Trim())作为DbSet);
}
如果((this.Filtro.IDStatusPesquisa!=null)&&(this.Filtro.IDStatusPesquisa>0))
{
temp=(temp.Where(p=>p.IDStatusPesquisa==this.Filtro.IDStatusPesquisa)作为DbSet);
}
if((this.Filtro.datacriaco_inical!=null)和&(this.Filtro.datacriaco_Final!=null))
{
temp=(temp.Where(p=>(p.DataCriacao>=this.Filtro.DataCriacao_inical)和&(p.DataCriacao p.DataCriacao>=this.Filtro.DataCriacao_inical)作为DbSet);
}
如果(this.Filtro.datacriaco_Final!=null)
{
温度=(其中温度(p=>p.DataCriacao p.Usuario)
.包括(p=>p.StatusPesquisa)
.包括(p=>p.TipoPesquisa)
.包括(p=>p.ModeloTermoAdesao)
.包括(p=>p.Pacientes)
.ToList();
} 

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

您不应该在每一行的末尾强制转换到DbSet。 还有,申报

IQueryable<Pesquisa> temp = db.Pesuisas;

// your code follows.
IQueryable temp=db.Pesuisas;
//你的代码如下。

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

是的。它做到了……非常感谢。因此,根据出现错误的原因,如果我开始对temp的var声明应用“where”方法,它也应该可以,对吗?[比如:“var temp=db.pesquisa.Where(p=>p.IDPesquisa>0);”]是的,应该可以。