ArgumentNullException: значение не может быть нулевым. (Параметр 'источник') - PullRequest
0 голосов
/ 18 июня 2020

У меня есть вложенные родительские и дочерние таблицы. Вот моя модель:

public class Categories
{
    [Key]
    public int CategoriesId { get; set; }
    public int Order { get; set; }
    public string CategoryName { get; set; }
    public List<News> News { get; set; }
}

public class News
{
    [Key]
    public int NewsId { get; set; }
    public int CategoriesId { get; set; }
    public string Content { get; set; }
    public DateTime Date { get; set; }
    ...
    public List<Comments> Comments { get; set; }
    public Categories Categories { get; set; }
}

public class Comments
{
    [Key]
    public int CommentsId { get; set; }
    public int NewsId { get; set; }
    public string Comment { get; set; }
    ...
    public News News { get; set; }
}

public class NewsImages
{
    [Key]
    public int ImageId { get; set; }
    public int NewsId { get; set; }
    public string ImageUrl { get; set; }
    public bool Cover { get; set;}
    ...
    public News News { get; set; }
}

Я пытаюсь отправить его из ViewComponent в View;

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var group = _dbContext.Categories.Where(k => k.Order != 0).OrderBy(h => h.Order)
            .Select(c => new
            {
                C = c,
                N = c.News.OrderByDescending(n => n.Date).Take(5)
                .Select(r => new
                {
                    Y = r.Comments,
                    R = r.NewsImages.Where(rs => rs.Cover == true).FirstOrDefault()
                })
            });
        var model = group
            .Select(m => m.C);                     
      return View(await model.ToListAsync()) ;
    }

Я уверен, что записей новостей достаточно для каждой категории, но я получаю ошибка: ArgumentNullException: значение не может быть нулевым. (Параметр 'источник') AspNetCore.Views_Shared_Components_IndexKategori_Default.ExecuteAsyn c () в Default.cs html

var bp = k.News.FirstOrDefault ();

, если я использую этот код, работает нормально:

var model = _dbContext.Categories
        .Include(h => h.News).ThenInclude(h => h.Comments)
        .Include(h => h.News).ThenInclude(h => h.NewsImages)
        .Where(h => h.Order != 0)
        .OrderBy(h => h.Order)

Но когда я использую приведенный выше код, для некоторых категорий появляется несколько записей, а некоторые категории реагируют так, как будто их нет.

Где я делаю ошибки? Заранее спасибо за тех, кто помог ..

1 Ответ

0 голосов
/ 18 июня 2020

Если у вас есть большой оператор LINQ, который вызывает исключение, и вы не можете найти, откуда возникает исключение, преобразуйте LINQ в более мелкие шаги и ToList() каждый шаг.

public async Task<IViewComponentResult> InvokeAsync()
{
    // Temp code: small steps, ToList after every step
    var a = dbContext.Categories.Where(category => category.Order != 0).ToList();
    var b = a.OrderBy(category => category.Order).ToList();
    var c = b.Select(category => new
    {
        Category = category,
        News = category.News.OrderByDescending(news => news.Date)
                            .Take(5)
                            .ToList();
    })
    .ToList();

    var d = c.Select(item => new
    {
        Category = item.Category,
        NewsItems = item.News.Select(news => new
        {
            Comments = news.Comments,
            Images = news.NewsImages.Where(newsImage => newsImage.Cover).ToList(),
        })
        .ToList(),
    })
    .ToList();

    var e = d.Select(item => new
    {
        Category = item.Category,
        NewsItems = item.NewsItems.Select(newsItem => new
        {
            Comments = newsItem.Comments,
            Images = images.FirstOrDefault();
        })
        .ToList(),
    })
    .ToList();

    // original code: 
    var group = _dbContext.Categories.Where...
}

Я уверен, что ваш отладчик скажет вам, какой шаг неверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...