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

时间:2012-09-30 20:04:19

标签: c# asp.net linq entity-framework

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

Id   Name        LName
-------------------------
5   Abbas        Dayyan
3   Mohammad     KD
4   Nima         Ahmad
1   Omid         Zangene
2   Pedram       Ahmadi

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

例如:

Id查询字符串为4,因此我们希望 Mohammad KD 作为上一行, Omid Zangene 作为下一行。

您能否指导我如何使用LINQ to Entity Framework。

修改
在实践中,表行的数量约为100万 默认情况下,表行没有按名称排序,wa需要按名称对结果进行排序。

2 个答案:

答案 0 :(得分: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();

修改:考虑新规范。

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

答案 1 :(得分:1)

试试这个:

 int id = 4;     
 var list = (from x in ctx.Table
            where x.id >= id - 1 && x.id <= id + 1
            select x).OrderBy(o -> o.name).ToList();

编辑:这将返回ID为3,4和5的元素。我不知道你是否实际按名称在数据库中对表进行排序,但如果你认为你更容易使用循环而不是使用linq获取上一个和下一个元素。

更新:按名称排序结果