.FirstOrDefault () возвращает null для непустого IQueryable

Каковы возможные причины, по которым .FirstOrDefault() возвращает null, если в коллекции есть хотя бы один элемент? Это использует Sitefinity, а менеджер видео встроен в CMS.

Код:

    protected virtual Video GetVideo(Guid id)
    {
        LibrariesManager librariesManager = LibrariesManager.GetManager();
        IQueryable<Video> videos = librariesManager.GetVideos(); // Five Items
        IQueryable<Video> x = videos.Where(d => d.Id == id); // Correctly filters to one item with the matching Id
        Video video = x.FirstOrDefault(); // null


        if (video != null)
        {
            video = librariesManager.Lifecycle.GetLive(video) as Video;
        }

        return video; // <- Breakpoint is set here.
    }

Результат для x:.FirstOrDefault () возвращает null для непустого IQueryable

Результат для video:.FirstOrDefault () возвращает null для непустого IQueryable

Я также пробовал просто использовать .First(), а также преобразовывать его в список и брать первый индекс с помощью x[0]. В коллекции каждый раз есть элемент, но видео всегда имеет значение NULL;

Для записи я слежу за это руководство и разбиваю запрос на несколько переменных, чтобы увидеть, что происходит на каждом этапе.

Редактировать: Чтобы уточнить, videos сам по себе представляет собой набор из пяти элементов, и .Where правильно фильтрует один элемент, соответствующий Id, который затем назначается x. Video video = x.FirstOrDefault(); - это первый случай, когда фактический результат отличается от ожидаемого.

Вероятно, вы проверяете его до того, как ему присвоено значение.

Ravi 26.10.2018 20:10
На основе вашего обновления - вы переназначаете video в блоке if и выполняете приведение, так что это две дополнительные причины, по которым экземпляр video может быть null в вашей точке останова.
Igor 26.10.2018 20:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
419
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы переназначаете video в блоке if, если он не равен нулю. С этим переназначением вы также передаете результат. Обе эти причины могут быть причинами, по которым video становится нулевым при достижении точки останова.

  • librariesManager.Lifecycle.GetLive(video) <- может вернуть значение null
  • Результат от librariesManager.Lifecycle.GetLive(video) может вернуть экземпляр, который нельзя преобразовать в Video, что приведет к присвоению значения null.
if (video != null) // so not null here
{
    video = librariesManager.Lifecycle.GetLive(video) as Video;
}
return video; // <- Breakpoint is set here.

Я думаю, у вас есть проверка if вашего оператора null в обратном порядке (проверка на null, а не на null), но это предположение, поскольку мы не знаем, что на самом деле делает Lifecycle.GetLive.

Это было. Спасибо.

Quangdao Nguyen 26.10.2018 20:47

@QuangdaoNguyen Я удалил свой ответ, так как этот теперь лучше. Я также сначала подумал, что у вас есть проверка if задом наперед. Но теперь я думаю, что смысл if заключается в «преобразовании» video в случае, когда video не равен нулю. Вы можете получить ту же логику с if (video == null) { return null; } return librariesManager.Lifecycle.GetLive(video) as Video;. Это зависит от вкуса (некоторые люди не любят два return в одном методе), но это может прояснить, откуда берется null.

Jeppe Stig Nielsen 26.10.2018 20:52

@JeppeStigNielsen Да, эта часть больше связана с Sitefinity, поэтому я не буду беспокоить вас всех этим здесь :)

Quangdao Nguyen 26.10.2018 20:55

@QuangdaoNguyen Извлеченный урок состоит в том, что независимо от того, на какую строку метода вы укажете во время отладки, отладчик покажет значение, которое эта переменная имеет Теперь, в то время, когда мы прерываем выполнение, нет значение, которое переменная имела, когда управление было возвращено на эта строка (на которую вы указываете) в программе.

Jeppe Stig Nielsen 26.10.2018 20:59
  1. Сначала проверьте, что в списке видео есть один элемент, который является именно вашим элементом (с d.Id именно этот идентификатор параметра)
  2. попробуйте использовать это

    var videos = LibraryManager.GetVideos();
    var video  = videos.where(d => d.id == id).FirstOrDefault();
    

OP обновил свой вопрос, вы можете удалить это.

Derrick Moeller 26.10.2018 20:30

Другие вопросы по теме