你好,这是一个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
});