如何基于多个日期对LINQ中的内容进行排序?

时间:2019-02-17 05:23:12

标签: c# 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();

我想要的是它应该以某种方式组合四个日期并将它们分组而不是一个一个地排序。

例如,目前,它根据主管人员看到该报告的日期对所有英语报告进行排序,然后是“简报”等等。

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

有可能吗?

3 个答案:

答案 0 :(得分:0)

您需要将它们全部放在一栏中。当您不希望它们按以下顺序显示时,我会采取的方法:假设各个单元格的值为null

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

如果愿意,可以在select子句中添加更多列。

引用自here

答案 1 :(得分:0)

为什么不只在日期上使用ImageIO.write(...).Min(),然后根据日期使用.Max().OrderBy()

Logic正在使用当前行的4个日期创建一个新的Enumerable(这里是一个数组),并计算4个日期的最大/最小:这将获得4个日期的最新/最早日期。根据此值进行记录。

.OrderByDescending()

答案 2 :(得分:0)

如果您对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。

如果您使用include来与他的1000名员工一起运输pm_main_repz 4,则每个员工将拥有一个值为4的pm_main_repzId。您将运输该值1001次,而1次就足够了

  

始终使用“选择”从数据库中选择数据,并仅选择您实际计划使用的属性。仅在计划更新获取的对象时使用Include

考虑使用适当的“选择”,仅在其中选择您打算实际使用的项目:

    .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
    });
相关问题