3
我有一個表,看起來像這樣的跟蹤,當一個人開始了一個項目:Linq查詢發現日期範圍
PersonId
ProjectId
StartDate
我想使用LINQ(LINQ到實體)來獲得結果這樣設置
PersonId
ProjectId
StartDate
EndDate
在哪裏結束日期是他們的下一個項目的起始日期(在按起始日期排序)或空,如果沒有最近的一個項目。
這是我做了什麼:
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()
})
是否有這樣做的更好的性能呢?
謝謝,這是有道理的。這個特定的表格有大約300K行,所以我不確定將它們全部加載到內存中。通常,我只想要這些結果的總和(例如,查找在一段時間內從事項目工作的人數),這意味着這僅僅是另一個查詢的基本查詢,所以它似乎是理想的保存它IQuerya ble – Adam
@Adam如果你把「修復循環」放在一個單獨的方法中,它需要一個正確排序的列表,你可以保留'IQueryable',並且只在你想要的子集在內存中時修復部分。 – dasblinkenlight
是的,我只是不能使用「EndDate」來過濾結果,直到修復循環之後。有時候我會想。我可能不得不做一些測試,看看這是如何比較。 – Adam