Navigation属性是否返回null?

时间:2018-05-28 16:36:37

标签: asp.net entity-framework entity-framework-core

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。有没有办法使用导航属性而不是使用查询语法和连接?

2 个答案:

答案 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是什么 - 它没有在发布的模型中显示,希望不是另一个未映射的属性。但是你明白了。)