Взятие последних предметов из каждой категории с расширением Linq - PullRequest
1 голос
/ 09 февраля 2020

Мне нужна помощь (потому что я пытаюсь выучить C# после 8-летнего перерыва)

У меня есть две таблицы, которые имеют отношение 1 ко многим.

    public class NewsCategory: IEntity
{
    public int NewsCategoryId { get; set; }
    public string NewsCategoryName { get; set; }
    public News News { get; set; }
}

И таблица новостей

public class News: IEntity
    {
        public int NewsId { get; set; }
        public string NewsHeader { get; set; }
        public string NewsContent { get; set; }
        public DateTime NewsReleaseDate => DateTime.Now;
        public string NewsImgUrl { get; set; }
        public int NewsCategoryId { get; set; }
        public NewsCategory NewsCategory { get; set; }
    }

NewsCategory.CategoryId разделены на 8 вариантов выбора. Например: Здоровье, Спорт, Путешествия, Мода ... И Table.News должен иметь только 1 categoryid из таблицы Category.

Вопрос в том, как я могу получить последние записи из каждой категории новостей?

Пример: в категории "Здоровье" было 10 записей, в категории "Спорт" - 20 записей ... Я хотел бы взять последние записи, написанные сегодня. Так как у меня 8 отборов по категориям, я должен вернуть 8 новостей.

Я попробовал несколько кодов, но не смог дозвониться ни в одну точку. Мой последний шанс - попросить помощи у вас, ребята.

Я попробовал несколько кодов, которыми поделились на inte rnet, но ни один из них не помог мне

public class EFNewsDal : EFGenericRepository<News, AdvertContext>, INewsDal
    {
        public List<News> GetLastEachNewsWithCategories()
        {
            using (AdvertContext con = new AdvertContext())
            {
                // con.News.Include(x => x.NewsCategory).Where(x => x.NewsCategoryId == x.NewsCategory.NewsCategoryId).Reverse().Select(x => x.NewsCategoryId).Distinct().ToList();
                //con.News.Include(x => x.NewsCategory).GroupBy(x => x.NewsCategoryId).Select(g => g.Last()).ToList();
              //var query1= con.Set<News>().Include(x => x.NewsCategory).Where(x => x.NewsCategoryId == x.NewsCategory.NewsCategoryId).GroupBy(x=>x.NewsCategoryId);
                //var query2 = query1.Select(g => g.Last());
            //    var query = from g in con.News
            //                where g.NewsCategoryId != 0
            //                group g by g.NewsCategoryId into grp
            //                select grp.OrderByDescending(g => g.NewsId).First();

            //    return query.ToList();
            //}                // con.News.Include(x => x.NewsCategory).Where(x => x.NewsCategoryId == x.NewsCategory.NewsCategoryId).GroupBy(x => x.NewsId).Select(grp => grp.LastOrDefault()).ToList();

        }
    }

обновление:

Я попробовал записанный код.

return con.News.Include(x => x.NewsCategory)
                   .GroupBy(x => x.NewsCategoryId)
                    .Select(x => x.ToList().OrderByDescending(c => c.NewsReleaseDate).First()).ToList();

Но я получаю эту ошибку сейчас. invalidOperationException

это может быть вызвано Core 3.0?

1 Ответ

0 голосов
/ 09 февраля 2020

Вам может потребоваться Группировать по NewsCategoryId и выбирать последние в каждой группе. Например,

con.News.Include(x => x.NewsCategory)
        .GroupBy(x=>x.NewsCategoryId)
        .Select(x=>x.ToList().OrderByDescending(c=>c.NewsReleaseDate).First());

Образец ввода

enter image description here

Образец вывода

enter image description here

...