我有一个MVC / ASP.NET Web应用程序,用于跟踪员工信息,例如StartDate,这是一种DateTime数据类型,表示特定员工在公司开始的时间。
我们还在公司为员工颁发奖励,并希望在公司分组5年,10年,15年,20年,25年,30年以上。
我如何编写一份Linq声明,该声明仅由员工(人员)组成,他们的公司时间已达到年度间隔基准(5,10,15等)之一,将接收& #34;公司的时间"奖?谢谢你的帮助。
答案 0 :(得分:1)
这个解决方案很棒!通过你的解决方案,我采用了你的主要逻辑,我做了一些改进,足够重要,我认为其他人可能从中受益。绝对不能用你的耐心帮助你的专业知识和我想要完成的事情。
请参阅下面的我的更改......
<强>控制器强>
public ActionResult LengthOfService()
{
ViewBag.Title = "Length of Service Awards Report";
var people = db.People.ToList().Where(p => !p.EndDate.HasValue);
var now = DateTime.Today;
var period = 5;
var maxPeriod = 30;
var query = (from p in people
let interval = DateTime.MinValue.AddDays((now - p.LengthOfService).TotalDays).Year / period
where interval > 0
group p by Math.Min(interval * period, maxPeriod) into x
orderby x.Key
select new AwardInfo
{
Years = x.Key,
People = x
}).ToList();
return View(query);
}
查看模型
public class AwardInfo
{
public int Years { get; set; }
public IEnumerable<People> People { get; set; }
}
查看强>
@model List<CPR.Models.AwardInfo>
<h2>@ViewBag.Title</h2>
<table class="table table-responsive table-hover">
<thead>
<tr>
<th class="col-sm-1">Service Award</th>
<th class="col-sm-2">Name</th>
<th class="col-sm-2">Date of Service</th>
<th class="col-sm-2">Company</th>
</tr>
</thead>
@foreach (var item in Model)
{
<tbody>
<tr>
<th class="panel-bg" colspan="5">@item.Years years</th>
</tr>
</tbody>
<tbody>
@foreach (var person in item.People)
{
<tr>
<td class="col-sm-1"></td>
<td class="col-sm-2">@person.LastName, @person.FirstName</td>
<td class="col-sm-2">@person.LengthOfService.ToShortDateString()</td>
<td class="col-sm-2">@person.Companies.Name</td>
</tr>
}
</tbody>
}
</table>