Nano Hash - криптовалюты, майнинг, программирование

В запросе EF LINQ создается исключение с нулевой ссылкой.

Я не смог найти точных слов, чтобы объяснить, что происходит, поэтому, если это дублированный вопрос, я извиняюсь.

Я попытался выполнить довольно простое условие AND if-clause внутри запроса LINQ, чтобы проверить, является ли объект нулевым, а затем проверить, равно ли его свойство столбцу, который я хотел сравнить, или нет.

Код:

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 становится нулевым, даже если я пытаюсь избежать исключения, сначала проверяя, является ли оно нулевым или нет.

Если я попытаюсь сделать ту же проверку непосредственно в Immediate Window, она вернет «false», как и должно быть.

Я что-то упустил здесь? Это может быть ошибка EF? Есть ли конкретная причина, по которой это работает, например, в .NET 4.5, а не в .NET Core 2.0?

Заранее спасибо.

ОБНОВИТЬ

Решение Ивана сделало работу:

Переписать? : конструкции с эквивалентом ||

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


Ответы:


1

Похоже, это может быть ошибка в 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();
}
08.01.2018

2

Чтобы избежать этой проблемы, убедитесь, что вы не оцениваете нулевой объект.

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))
...
26.06.2019

3

как насчет упрощения кода до чего-то вроде

public IEnumerable<Plan> GetPlans(int year)
{
    return _context.Plans
        .Where(e => e.Excercise.Year == year)
        .ToList();
}
08.01.2018
  • В предложении Where есть больше условий, я просто удалил их, чтобы не допустить беспорядка в коде. Я отредактирую вопрос, чтобы сделать его более очевидным. 08.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..