【问题标题】:Taking last items from each category with Linq extension使用 Linq 扩展从每个类别中获取最后一项
【发布时间】:2020-02-09 10:14:33
【问题描述】:

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

我有两个具有一对多关系的表。

    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 必须只有 Category 表中的 1 个 categoryid。

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

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

我尝试了一些代码,但我无法达到任何时候。我最后的机会是在这里向你们寻求帮助。

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

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 引起的?

【问题讨论】:

标签: linq entity-framework-core categories extension-methods


【解决方案1】:

您可能需要按 NewsCategoryId 分组并在每个组中选择最新的。例如,

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

示例输入

样本输出

【讨论】:

  • 谢谢您的回答先生。发生了另一个问题。为了更详细,我将消息打印下来。
  • @user1104363 您能否提及您希望在结果中添加的所有详细信息?
  • 我阅读并修复了 EF Core 3.0 的一些变化。谢谢...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多