两个类定义如下:
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。
并且在结果视图中,博客表的每一行的“帖子”列为空。
答案 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
}