3

当一个人开始一个项目时,我有一个看起来像这样的表格:

PersonId
ProjectId
StartDate

我想使用 linq (linq-to-entities) 来获得这样的结果集

PersonId
ProjectId
StartDate
EndDate

其中 EndDate 是他们下一个项目的开始日期(当按 StartDate 排序时),如果没有最近的项目,则为 null。

这就是我所做的:

context.PersonProjects.Select(pp => new {
    pp.PersonId,
    pp.ProjectId,
    pp.StartDate,
    EndDate = context.PersonProjects.Where(pp2 => pp2.PersonId == pp.PersonId && pp2.StartDate > pp.StartDate).OrderBy(pp2 => pp2.StartDate).Select(pp2 => pp2.StartDate).FirstOrDefault()
})

有没有更高效的方法来做到这一点?

4

1 回答 1

1

一种更高效(但看起来不那么干净)的方法是将所有内容读入按开始日期排序的列表中,然后遍历列表,并获取以下项目的开始日期(如果有):

// You need a named class in order to make this work
class PersonProject {
    int PersonId {get;set;}
    int ProjectId {get;set;}
    DateTime StartDate {get;set;}
    DateTime EndDate {get;set;}
}
...
// Run your query, and put the results in a list
var listOfProjects = context
    .PersonProjects
    .OrderBy(pp => pp.StartDate)
    .Select(pp => new PersonProject {
        PersonId = pp.PersonId,
        ProjectId = pp.ProjectId,
        StartDate = pp.StartDate
    }).ToList();
// Now walk through the list, setting the end time to the start of the next item
for (int i = 0 ; i < listOfProjects.Length-1 ; i++) {
    listOfProjects[i].EndDate = listOfProjects[i+1].StartDate;
}

此解决方案的查询和“修复”部分都是线性的,因此性能与读取PersonProject表本身一样好。

于 2013-10-04T15:33:20.553 回答