实体框架在执行Lambda表达式时引发错误

时间:2019-01-19 21:32:06

标签: c# asp.net entity-framework-core

我有这段代码用于从数据库中获取和过滤产品结果:

if (userParams.MinPrice > 0 && userParams.MaxPrice != 999999999) 
{
    products = products.Where(p => (p.Price >= userParams.MinPrice) && 
                                   (p.Price <= userParams.MaxPrice));
}

仅提供userParams.MinPrice时成功执行,但是提供userParams.MaxPrice时失败。

我得到的错误是这个。

  

执行请求时发生未处理的异常。

     

System.InvalidOperationException:尝试评估LINQ查询参数表达式时引发了异常。要显示其他信息,请在覆盖DbContext.OnConfiguring时调用EnableSensitiveDataLogging()。

     

System.NullReferenceException:对象引用未设置为实例   一个对象。

     

在lambda_method(关闭)
  在Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.ParameterExtractingExpressionVisitor.Evaluate(Expression expression,String&parameterName)。

有人知道解决方案吗?请帮助

1 个答案:

答案 0 :(得分:0)

这很简单,您的错误解释了它。 userParams.MaxPrice为空。因此,您需要向其添加null检查。一种简单的方法是将查询更改为:

if (userParams.MinPrice > 0 && userParams.MaxPrice != null && userParams.MaxPrice != 999999999) 
{
    products = products.Where(p => (p.Price >= userParams.MinPrice) && 
                                   (p.Price <= userParams.MaxPrice));
}

尽管根据您的逻辑,您可能需要稍作更改。关键是不要假定某个属性具有值,如果该值可以为空,则需要首先验证它是否不为空,然后进行检查。

还应该补充一点,假设这是一个可为null的int或类似内容,理论上您可以做userParams.MaxPrice.GetValueOrDefault() != 999999999