Запрос Linq возвращает ноль при использовании отношения ядра EF - PullRequest
0 голосов
/ 07 июня 2019

Два класса определены следующим образом:

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

Ответы [ 3 ]

2 голосов
/ 07 июня 2019

Попытка переписать запрос 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 голос
/ 07 июня 2019

Поскольку нет отложенной загрузки, вам нужно включить сущность. Посты

var blog = context.Blog
                   .Include(b => b.Posts)
                   .FirstOrDefault(e => e.BlogId == 1);

, так как вы выполняете Firtordefault, вам нужно проверить на ноль

if(blog != null)
{
  ... do your work
}
1 голос
/ 07 июня 2019

Лучше, если вы включите предложение select здесь.Вызов FirstOrDefault () для вашего запроса вернет первый результат запроса или значение по умолчанию для типа (скорее всего, null в этом случае).попробуйте это

var posts =
    (from e in context.Blog
    where e.BlogId == 1
    select e).FirstOrDefault();
...