【问题标题】:Get TOP5 records from each status using Linq C#使用 Linq C# 从每个状态中获取 TOP5 记录
【发布时间】:2020-11-09 11:58:33
【问题描述】:

我有一个VacancyApply 表,该表由状态 ID 组成,所以我需要来自每个状态的 Top5 数据。我想获取每个状态的前 5 条记录。状态类似于 1、2、3

我的查询

 var result = (from ui in _context.VacancyApply
              join s in _context.UserProfile on ui.UserId equals s.UserId
              join x in _context.Vacancy on ui.VacancyId equals x.VacancyId
              join st in _context.Status on ui.StatusId equals st.StatusId
              where ui.UserId == userId && ui.IsActive == true
              orderby ui.StatusId
              select new VacancyApply
              {
                  VacancyApplyId = ui.VacancyApplyId,
                  VacancyId = ui.VacancyId,
                  UserId = ui.UserId,
                  StatusId = ui.StatusId,
                  VacancyName = x.VacancyName,
                  VacancyStack = x.VacancyStack,
                  VacancyEndDate = x.VacancyEndDate,
                  StatusName = st.StatusName,
                  UserName = s.FirstName

              }).ToList();

【问题讨论】:

  • 您也应该发布无法正常工作的内容。
  • @Krusty 我只想限制每个状态的前 5 名
  • result.GroupBy(x => x.StatusId).Select(x => x.Take(5).ToList()).ToList();
  • 像这样:group st by st.StatusId into groups select groups.select(s=> new VacancyApply { VacancyApplyId = ui.VacancyApplyId, //... }).Take(5)).ToList();?
  • 应该选择很多@jdweng​​span>

标签: c# asp.net .net linq linq-to-sql


【解决方案1】:

现在我可以从输出中看到它包含一个VacancyId 和一个VendorId。 我感觉VacancyStatus 表之间存在多对多关系。

不过,答案非常简单:您需要使用 LINQ Take 扩展方法(也许在 OrderBy 之后跟随它会很好,因为如果没有一些,只取最后一项是没有意义的逻辑):

var output = (logic to join, filter, etc.).OrderBy(lambda).Take(N); // N is the number of
                                                               // items you want to select

现在,如果您希望一般Vacancy 获取最后的项目,并且只有在与 Status 加入后,请执行以下操作:

var output = Vacancy.OrderBy(lambda).Take(N).(now join, filter, etc. with other tables);

但是,如果您想将所有类似的状态与空缺一起分组并且仅在获得热门项目后,请使用GroupBy

var output = (logic to join, filter, etc.).GroupBy(st => st.StausId).
                                          .Select(group => group.OrderBy(lambda).Take(N));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多