Linq query returns null when using the EF core relationship
Linq query returns null when using the EF core relationship
两个class定义如下:
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();
抛出一个异常,表示值不能为空。
在结果视图中,博客的帖子列 Table 每行都是空的。
尝试重写查询
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;
最好在此处包含 select 子句。在查询中调用 FirstOrDefault() 将 return 查询的第一个结果或类型的默认值(在这种情况下很可能为 null)。
试试这个
var posts =
(from e in context.Blog
where e.BlogId == 1
select e).FirstOrDefault();
由于没有延迟加载,您需要包含实体 Posts
var blog = context.Blog
.Include(b => b.Posts)
.FirstOrDefault(e => e.BlogId == 1);
当你在做 Firstordefault 时你需要检查 null
if(blog != null)
{
... do your work
}
两个class定义如下:
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();
抛出一个异常,表示值不能为空。
在结果视图中,博客的帖子列 Table 每行都是空的。
尝试重写查询
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;
最好在此处包含 select 子句。在查询中调用 FirstOrDefault() 将 return 查询的第一个结果或类型的默认值(在这种情况下很可能为 null)。 试试这个
var posts =
(from e in context.Blog
where e.BlogId == 1
select e).FirstOrDefault();
由于没有延迟加载,您需要包含实体 Posts
var blog = context.Blog
.Include(b => b.Posts)
.FirstOrDefault(e => e.BlogId == 1);
当你在做 Firstordefault 时你需要检查 null
if(blog != null)
{
... do your work
}