我找不到确切的词来解释发生的事情,所以如果这是一个重复的问题,我道歉。
我尝试在LINQ查询中执行一个非常简单的条件if-clause,以检查对象是否为null,然后验证其属性是否与我想要比较的列相等。
代码:
public IEnumerable<Plan> GetPlans(Plan plan)
{
return _context.Plans.Where(e =>
e.Situation == plan.Situation &&
e.Notes.Contains(plan.Notes) &&
(plan.Excercise != null && plan.Exercise.Year > 0 ? e.Exercise.Year == plan.Exercise.Year: true)).ToList();
}
我之前已经在.NET 4.5中做了十几次这样的检查,没有任何问题。
但是现在,在我正在开发的第一个.NET Core 2.0项目中,我遇到了以下错误:
An exception was thrown while attempting to evaluate a LINQ query parameter expression. To show additional information call EnableSensitiveDataLogging() when overriding DbContext.OnConfiguring.
内部异常更清晰: NULL REFERENCE EXCEPTION 。
经过一些测试后,我发现当plan.Exercise为空时发生错误,即使我试图通过首先检查它是否为null来避免异常。
如果我尝试直接在立即窗口中进行相同的检查,它将返回“false”,因为它应该是。
我在这里遗漏了什么吗?它可能是一个EF错误?例如,在.NET 4.5中使用它的任何特殊原因,而不是在.NET Core 2.0中?
提前致谢。
更新
伊万的解决方案完成了这项工作:
重写? :具有等效的构造||
plan.Excercise == null || plan.Exercise.Year <= 0 || e.Excercise.Year == plan.Exercise.Year
答案 0 :(得分:3)
听起来这可能是EF Core中的一个错误(但我肯定不知道)。
如果不满足plan
的基本要求,您可能尝试的一件事是快速失败,更重要的是,不使用三元运算符,而是使用传统的比较运算符和括号:
public IEnumerable<Plan> GetPlans(Plan plan)
{
if (plan == null) return new List<Plan>();
return _context.Plans
.Where(e =>
e.Situation == plan.Situation &&
e.Notes.Contains(plan.Notes) &&
(plan.Exercise == null ||
plan.Exercise.Year <= 0 ||
e.Excercise.Year == plan.Exercise.Year))
.ToList();
}
答案 1 :(得分:0)
如何将代码简化为
public IEnumerable<Plan> GetPlans(int year)
{
return _context.Plans
.Where(e => e.Excercise.Year == year)
.ToList();
}
答案 2 :(得分:0)
为避免此问题,请确保您未对空对象进行评估。
var exercice = await _repositoryExercice.FirstOrDefaultAsync(i => i.IsCurrent);
var depenses = _repositoryDepense.GetAll()
.Where( e => e.ExerciceId.Equals(exercice.Id))
.WhereIf(AbpSession.TenantId.HasValue, m => m.TenantId.Value.Equals(AbpSession.TenantId.Value))
.ToList();
此问题由.Where( e => e.ExerciceId.Equals(exercice.Id))
行引起,因为变量exercice
为空。
最佳实践,我用以下代码替换了这一行:
...
.WhereIf(exercice != null, e => e.ExerciceId.Equals(exercice.Id))
...