首页 > 解决方案 > 使用 Linq C# 从每个状态中获取 TOP5 记录

问题描述

我有一个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();

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

解决方案


现在我可以从输出中看到它包含 OneVacancyId和 One VendorIdVacancy我有一种感觉,Status表之间存在多对多关系。

但是,答案非常简单:您需要使用 LINQTake扩展方法(也许在之后跟随它会很好,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));


推荐阅读