繁体   English   中英

EF LINQ查询if子句中抛出空引用异常

[英]Null reference exception being thrown in EF LINQ query if-clause

我找不到确切的词来解释发生了什么,所以如果这是一个重复的问题,我道歉。

我试图在LINQ查询中做一个非常简单的AND条件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时会发生错误,即使我尝试通过先检查它是否为null来避免异常。

如果我尝试直接在立即窗口中进行相同的检查,它将返回“false”,因为它应该是。

我在这里错过了什么吗? 它可能是一个EF错误? 例如,在.NET 4.5中,这种情况有什么特别的原因,而不是在.NET Core 2.0中?

提前致谢。

UPDATE

伊万的解决方案完成了这项工作:

改写? :具有等效||的构造

plan.Excercise == null || plan.Exercise.Year <= 0 || e.Excercise.Year == plan.Exercise.Year

听起来这可能是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();
}

如何将代码简化为类似的东西

public IEnumerable<Plan> GetPlans(int year)
{
    return _context.Plans
        .Where(e => e.Excercise.Year == year)
        .ToList();
}

要避免此问题,请确保您没有在null对象上进行求值。

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为null。

最佳实践,我用这个替换了这一行:

...
.WhereIf(exercice != null, e => e.ExerciceId.Equals(exercice.Id))
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM