使用 Linq 扩展从每个类别中获取最后一项

Taking last items from each category with Linq extension

我需要一些帮助(因为我在 8 岁休息后尝试学习 C#)

我有两个 table 具有一对多关系。

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

和新闻 table

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 必须只有类别 table 中的 1 个类别 ID。

问题是如何从每个 NewsCategories 中获取最后的条目?

例如:健康类别有 10 个条目,运动类别有 20 个条目...我想把最后一个条目写在今天。因此,由于我有 8 个类别选择,因此我必须带回 8 个新闻。

我尝试了一些代码,但始终无法访问。我最后的机会是在这里向你们寻求帮助。

我尝试了一些在互联网上共享的代码,但 none 对我有用。

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();

但是我现在收到这个错误。

这可能是由 Core 3.0 引起的?

您可能需要按 NewsCategoryId 分组,select 每组中的最新内容。例如,

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

示例输入

示例输出