如何根据许多日期在LINQ中进行分类



你好,这是一个linq查询,但由于涉及四个不同的日期,因此无法正确排序。

var EventReportRemarks = (from i in _context.pm_main_repz
                                   .Include(a => a.PM_Evt_Cat)
                                   .Include(b => b.department)
                                   .Include(c => c.employees)
                                   .Include(d => d.provncs)
                          where i.department.DepartmentName == "Finance"
                          orderby i.English_seen_by_executive_on descending
                          orderby i.Brief_seen_by_executive_on descending
                          orderby i.French_seen_by_executive_on descending
                          orderby i.Russian_seen_by_executive_on descending
                          select i).ToList();

我想要的是,它应该以某种方式将四个日期组合在一起,然后将它们分组为一个。

例如,目前,它根据高管看到的日期,然后简要报告等日期对所有英语报告进行了分类。

,但我希望它应该先检查哪一个,依此类推。例如,如果看到的第一个报告是法语,则简要介绍,然后是英语,然后是俄语,因此应该相应地对其进行分类。

可能是?

您需要将它们全部放入一个列中。当您不希望它们以:

显示以下顺序时,我会采用的方法是,假设各个单元格的值是无效的。
var EventReportRemarks = (from i in _context.pm_main_repz
                                   .Include(a => a.PM_Evt_Cat)
                                   .Include(b => b.department)
                                   .Include(c => c.employees)
                                   .Include(d => d.provncs)
                          where i.department.DepartmentName == "Finance"
                          select new
                          {
                              Date = 
                              (
                                  i.English_seen_by_executive_on != null ? i.English_seen_by_executive_on :
                                  i.Brief_seen_by_executive_on != null ? i.Brief_seen_by_executive_on :
                                  i.French_seen_by_executive_on != null ? i.French_seen_by_executive_on :
                                  i.Russian_seen_by_executive_on
                              )
                          }).ToList().OrderBy(a => a.Date);

在"选择"子句中,您可以添加更多列。

参考从这里获取。

为什么不在日期使用.Min().Max(),然后基于.OrderBy().OrderByDescending()

逻辑正在创建一个具有当前行的4个日期的新枚举(此处,一个数组),并计算4个日期的最大/min:这导致获得4.的最新/最早。基于此值的记录。

var EventReportRemarks = (from i in _context.pm_main_repz
                                   .Include(a => a.PM_Evt_Cat)
                                   .Include(b => b.department)
                                   .Include(c => c.employees)
                                   .Include(d => d.provncs)
                          where i.department.DepartmentName == "Finance"
                          select i)
.OrderBy(i => new[]{ 
    i.English_seen_by_executive_on,
    i.Brief_seen_by_executive_on, 
    i.French_seen_by_executive_on, 
    i.Russian_seen_by_executive_on 
    }.Max())
.ToList();

如果将方法语法用于linq查询而不是查询语法。

var EventReportRemarks = _context.pm_main_repz
    .Where(rep => rep.Department.DepartmentName == "Finance")
    .OrderByDescending(rep => rep.English_seen_by_executive_on)
    .ThenByDescending(rep => rep.Brief_seen_by_executive_on)
    .ThenByDescending(rep => rep.French_seen_by_executive_on descending)
    .ThenByDescending(rep => resp.Russian_seen_by_executive_on descending)
    .Select(rep => ...);

优化

数据库查询的较慢部分之一是将所选数据从DBMS传输到本地流程。因此,明智的做法是将运输的数据限制为您实际计划使用的值。

您运输的数据超出了您的需要。

例如。每个PM_MAIN_REPZ(我,您都喜欢为您的物品使用简单的标识符,不是吗?),每个PM_MAIN_REPZ都有零或更多员工。每个员工都使用pm_main_repzid的外键恰好属于一个PM_MAIN_REPZ。

如果您使用的是运输PM_MAIN_REPZ 4,他的1000名员工将拥有一个带有值的PM_MAIN_REPZID。

始终使用SELECT从数据库中选择数据,并仅选择您实际计划使用的属性。仅当您打算更新获取的对象

时使用Incluct

考虑使用适当的选择仅选择实际计划使用的项目:

    .Select(rep => new
    {
        // only Select the rep properties you actually plan to use:
        Id = rep.Id,
        Name = rep.Name,
        ...
        Employees = rep.Employees.Select(employee => new
        {
            // again: select only the properties you plan to use
            Id = employee.Id,
            Name = employee.Name,
            // not needed: foreign key to pm_main_repz
            // pm_main_repzId = rep.pm_main_repzId,
        })
        .ToList(),
        Department = new 
        {
            Id = rep.Department,
            ...
        }
        // etc for pm_evt_cat and provencs
    });

最新更新