按ID和名称获取下一个和上一个sql行,EF?

Moh*_*yan 2 c# linq asp.net entity-framework

假设我们在SQL Server表中有以下数据(按名称排序):

Id   Name        LName
-------------------------
5   Abbas        Dayyan
3   Mohammad     KD
4   Nima         Ahmad
1   Omid         Zangene
2   Pedram       Ahmadi
Run Code Online (Sandbox Code Playgroud)

我们有一个Id查询字符串,我们想从Id获取下一行和上一行(如果存在).

例如:

Id查询字符串是4,因此我们希望将Mohammad KD作为前一行,将Omid Zangene作为下一行.

你能指导我如何使用LINQ to Entity Framework做到这一点.

编辑:
实际上,表行数约为100万.
默认情况下,表行没有按名称排序,wa需要按名称对结果进行排序.

Ris*_*tin 5

这个怎么样?

var result = (from person in db.People
              where person.Id == id
              let ordered = db.People.OrderBy(p => p.Name)                  
              let reversed = db.People.OrderByDescending(p => p.Name)                  
              let previous = reversed.SkipWhile(p => p.Id != id).Skip(1).FirstOrDefault()
              let next = ordered.SkipWhile(p => p.Id != id).Skip(1).FirstOrDefault()
              select new { previous, next }).First();
Run Code Online (Sandbox Code Playgroud)

编辑:考虑新规范.

编辑2:修改代码不使用LastOrDefault,这不适用于LINQ to Entities.