.FirstOrDefault()在非空IQueryable上返回null

时间:2018-10-26 17:52:38

标签: c# linq

如果集合中至少有一项,.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的结果: Result for x

video的结果: Result for video

我还尝试过简单地使用.First()并将其转换为List并使用x[0]获取第一个索引。集合每次都有一个项目,但视频始终为空;

为便于记录,我关注this guide,并将查询分为多个变量以查看每一步的情况。

编辑: 需要说明的是,videos本身是五个项目的集合,.Where正确地过滤为与Id相匹配的单个项目,然后将其分配给xVideo video = x.FirstOrDefault();是实际结果与预期结果不同的第一个实例。

2 个答案:

答案 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)

  1. 首先检查视频列表中是否有一项与您的项目完全相同(d.Id正是该参数id)
  2. 尝试使用

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