Свойство навигации возвращает ноль? - PullRequest
0 голосов
/ 28 мая 2018
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 голосов
/ 28 мая 2018

Как правило, избегайте использования не сопоставленных свойств в запросе 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 - не отображаетсяв размещенной модели, и надеюсь, что это не еще одно не нанесенное на карту свойство. Но вы поняли).

0 голосов
/ 28 мая 2018

Я думаю, вам нужно обновить код с этого. Пост к этому. Стоит так

public Post FirstPost { 
      get {
         return this.Posts.OrderBy(p=> p.PostedDate).FirstOrDefault();
      }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...