LINQ,获取我表中的下一个和上一个记录(我很困惑)

时间:2016-12-23 04:54:20

标签: c# wpf linq

所以这是我第一次使用LINQ而且我喜欢它到目前为止......但是出于某种原因,我只能在我的表中获得一次下一条记录而且我不确定为什么它不会继续我的活动。

  /*var next = (from a in dc.Employees
                       where a.PrimaryID > Convert.ToInt16(PrimaryID.Text) &&
                       a.PrimaryID < Convert.ToInt16(PrimaryID.Text)+2 select a);*/

我知道我的上述工作,但它使用的条件是假设主键中的顺序没有丢失记录。因此,如果我删除了一条记录,它将不再起作用,所以我去尝试“Skip。()。Take()”方法。

    var next = from a in dc.Employees.Skip(1).Take(1) select a;

    FirstNameEmpBox.DataContext = next;
    LastNameEmpBox.DataContext = next;
    StatusEmpBox.DataContext = next;

这确实有效,但只有一次。因此,在我的点击事件中,它会跳转到下一个非常棒的记录。但是,如果我再次单击我的下一个按钮,它只是位于该记录上并且不会跳过它。我不是肯定我做错了什么。非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

因为你的LINQ查询的Skip()方法有一个 1 的常量。

从语法上讲,你总是跳过员工集合的第一条记录,并在每次执行此记录后获取下一条记录。

另外,要执行skip和take,您需要更改LINQ查询以包含order by子句

您可能必须创建一个int变量来遍历Employee集合。

这样的事情:

var counter = 0; // Manage this counter variable accordingly
var next = (from a in dc.Employees order by a.employee_id select a).Skip(counter).Take(1);

答案 1 :(得分:1)

如果要从Employee中获取下一条记录,其中PrimaryId大于您当前在TextBox中的记录,则可以与此值进行比较,并使用FirstOrDefault()方法获取第一个匹配项:

var next = (from a in dc.Employees
            where a.PrimaryID > Convert.ToInt16(PrimaryID.Text)
            orderby a.PrimaryID
            select a).FirstOrDefault();

同样获得之前的记录:

var prev = (from a in dc.Employees
            where a.PrimaryID < Convert.ToInt16(PrimaryID.Text)
            orderby a.PrimaryID
            select a).FirstOrDefault();

答案 2 :(得分:0)

如果你想要一个序列的下一个项目用Linq指定上一个项目的“id”,那么你应该首先为“id”命令序列,然后,你应该将有序序列的元素计算到你的“id”因此从原始有序序列中跳过这些元素,最后你必须从原始有序序列的剩余部分中只取一个元素,这将是序列中的“下一个”。

对于前一项中序列中下一个元素的“id”,您可以进行类似的推理,反转要排除的元素的计数标准。

在您的具体案例中,请尝试:

var emplOrdered = from a in dc.Employees order by a.PrimaryID 

var next = (from a in emplOrdered)
           .Skip(
                 emplOrdered.Where(a.PrimaryID <= Convert.ToInt16(PrimaryID.Text)).Count()
           ).Take(1);

答案 3 :(得分:0)

var next = (from a in dc.Employees
            where a.PrimaryID > Convert.ToInt16(PrimaryID.Text)
            orderby a.PrimaryID
            select a).FirstOrDefault();

上一条记录:

var prev = (from a in dc.Employees
            where a.PrimaryID < Convert.ToInt16(PrimaryID.Text)
            orderby a.PrimaryID descending
            select a).FirstOrDefault();