如果集合中至少有一项,.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()
并将其转换为List并使用x[0]
获取第一个索引。集合每次都有一个项目,但视频始终为空;
为便于记录,我关注this guide,并将查询分为多个变量以查看每一步的情况。
编辑:
需要说明的是,videos
本身是五个项目的集合,.Where
正确地过滤为与Id
相匹配的单个项目,然后将其分配给x
。 Video video = x.FirstOrDefault();
是实际结果与预期结果不同的第一个实例。
答案 0 :(得分:3)
如果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),但这是一个猜测,因为我们不知道{{1} }确实可以。
答案 1 :(得分:0)
尝试使用
var videos = LibraryManager.GetVideos();
var video = videos.where(d => d.id == id).FirstOrDefault();