Каковы возможные причины, по которым .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.
}
Я также пробовал просто использовать .First()
, а также преобразовывать его в список и брать первый индекс с помощью x[0]
. В коллекции каждый раз есть элемент, но видео всегда имеет значение NULL;
Для записи я слежу за это руководство и разбиваю запрос на несколько переменных, чтобы увидеть, что происходит на каждом этапе.
Редактировать:
Чтобы уточнить, videos
сам по себе представляет собой набор из пяти элементов, и .Where
правильно фильтрует один элемент, соответствующий Id
, который затем назначается x
. Video video = x.FirstOrDefault();
- это первый случай, когда фактический результат отличается от ожидаемого.
video
в блоке if
и выполняете приведение, так что это две дополнительные причины, по которым экземпляр video
может быть null
в вашей точке останова.
Вы переназначаете 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
.
Это было. Спасибо.
@QuangdaoNguyen Я удалил свой ответ, так как этот теперь лучше. Я также сначала подумал, что у вас есть проверка if
задом наперед. Но теперь я думаю, что смысл if
заключается в «преобразовании» video
в случае, когда video
не равен нулю. Вы можете получить ту же логику с if (video == null) { return null; } return librariesManager.Lifecycle.GetLive(video) as Video;
. Это зависит от вкуса (некоторые люди не любят два return
в одном методе), но это может прояснить, откуда берется null
.
@JeppeStigNielsen Да, эта часть больше связана с Sitefinity, поэтому я не буду беспокоить вас всех этим здесь :)
@QuangdaoNguyen Извлеченный урок состоит в том, что независимо от того, на какую строку метода вы укажете во время отладки, отладчик покажет значение, которое эта переменная имеет Теперь, в то время, когда мы прерываем выполнение, нет значение, которое переменная имела, когда управление было возвращено на эта строка (на которую вы указываете) в программе.
попробуйте использовать это
var videos = LibraryManager.GetVideos();
var video = videos.where(d => d.id == id).FirstOrDefault();
OP обновил свой вопрос, вы можете удалить это.
Вероятно, вы проверяете его до того, как ему присвоено значение.