Linq:按日期间隔分组(5,10,15等年份)

时间:2017-08-12 01:43:36

标签: c# asp.net sql-server linq

我有一个MVC / ASP.NET Web应用程序,用于跟踪员工信息,例如StartDate,这是一种DateTime数据类型,表示特定员工在公司开始的时间。

我们还在公司为员工颁发奖励,并希望在公司分组5年,10年,15年,20年,25年,30年以上。

我如何编写一份Linq声明,该声明仅由员工(人员)组成,他们的公司时间已达到年度间隔基准(5,10,15等)之一,将接收& #34;公司的时间"奖?谢谢你的帮助。

1 个答案:

答案 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>

enter image description here