class Topic {
public int TopicId {get;set;}
public virtual ICollection<Post> Posts { get; set; }
public Post FirstPost {
get {
return this.Posts.OrderBy(p=> p.PostedDate).FirstOrDefault();
}
}
}
class Post {
public int PostId {get;set; }
public int TopicId {get;set;}
public DateTime PostedDate {get;set;}
public virtual Topic Topic {get;set;}
}
var query = Database.Forums.Where(p=> p.Id == id).Select(p=> new {
p.Title,
Topics = p.Topics.OrderByDescending(p=> p.LastPostedDate).Select(t=> new {
t.TopicId,
t.FirstPost.PostId
})
}).ToList();
当我运行此查询时,即使主题确实在数据库中有帖子,t.FirstPost也为null。有没有办法使用导航属性而不是使用查询语法和连接?
答案 0 :(得分:0)
我认为您需要更新此代码.Post to this.Posts like this
public Post FirstPost {
get {
return this.Posts.OrderBy(p=> p.PostedDate).FirstOrDefault();
}
}
答案 1 :(得分:0)
通常避免在LINQ to Entities查询中使用未映射的属性。它们无法转换为SQL,即使EF Core支持客户端评估,访问导航属性也存在问题,因为它们在评估发生时尚未加载。
您可以在LINQ to Entities查询中使用导航属性(实际上优于显式连接),但使用显式表达式,即不隐藏在未映射的属性后面:
var query = Database.Forums.Where(f => f.Id == id).Select(f => new
{
f.Title,
Topics = f.Topics.OrderByDescending(t => t.LastPostedDate).Select(t => new
{
t.TopicId,
FirstPostId = Posts.OrderBy(p => p.PostedDate).Select(p => (int?)p.PostId).FirstOrDefault(),
})
}).ToList();
(不确定LastPostedDate
是什么 - 它没有在发布的模型中显示,希望不是另一个未映射的属性。但是你明白了。)