使用EF核心关系时Linq查询返回null

时间:2019-06-07 06:24:41

标签: c# relationship ef-core-2.0

两个类定义如下:

class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}
class Post
{
     public int PostId { get; set; }
     public string Title { get; set; }
     public string Content { get; set; }

     public int BlogId { get; set; }
     public Blog Blog { get; set; }
}

以及使用此Linq查询时:
var posts = context.Blog.FirstOrDefault(e => e.BlogId == 1).Posts.ToList();
抛出异常,该异常表明value不能为null。 并且在结果视图中,博客表的每一行的“帖子”列为空。

3 个答案:

答案 0 :(得分:2)

尝试重写查询 FirstOrDefault导致查询数据库,因此可能无法加载关系

因此在查询之前先进行投影:

var posts = context.Blog
                   .SelectMany(b => b.Posts)
                   .Where(p => p.BlogId == 1)
                   .ToList();

其他选择是使用.Include()

var posts = context.Blog
                   .Include(b => b.Posts)
                   .FirstOrDefault(e => e.BlogId == 1)
                   ?.Posts;

答案 1 :(得分:1)

最好在这里包含select子句。在查询上调用FirstOrDefault()将返回查询的第一个结果或该类型的默认值(在这种情况下,很可能为null)。 试试这个

var posts =
    (from e in context.Blog
    where e.BlogId == 1
    select e).FirstOrDefault();

答案 2 :(得分:1)

由于没有延迟加载,您需要包括实体帖子

var blog = context.Blog
                   .Include(b => b.Posts)
                   .FirstOrDefault(e => e.BlogId == 1);

在执行Firtordefault时,需要检查是否为空

if(blog != null)
{
  ... do your work
}