使用LINQ to SQL实现Next / Previous

时间:2009-08-20 19:01:16

标签: c# winforms linq data-access-layer

我有以下代码,试图允许用户通过单击WinForm上的Next或Previous来“逐步完成”DB中的Case Notes。它只会获得First Case Note。 我做错了什么?

这篇文章有很多编辑,我道歉,但在遵循Jon Skeet的建议后,我能够“修复”原本错误但仍然无效。

我是否需要重新构建查询以考虑当前注释?如果是这样,我该怎么做?

    public static Guid NextCaseNoteID (int personID)
    {
        var context = new MatrixDataContext();

        Guid nextNoteID = (from caseNote in context.tblCaseNotes
                                                   where caseNote.PersonID == personID
                                                   orderby caseNote.InsertDate
                                                   select caseNote.CaseNoteID ).Skip(1).FirstOrDefault();

        return nextNoteID;
    }


这就是我最终的结果,感谢所有发布并遵循我思想不良思路的人......

虽然我现在正试图证明我是否还需要Skip(1),但它似乎运作良好.... 谢谢!

以供将来参考

        public static Guid NextCaseNoteID (int personID, DateTime? insertDate)
    {
        var context = new MatrixDataContext();

        Guid nextNoteID = (from caseNote in context.tblCaseNotes
                                                   where caseNote.PersonID == personID && caseNote.InsertDate > insertDate
                                                   orderby caseNote.InsertDate
                                                   select caseNote.CaseNoteID ).Skip(1).FirstOrDefault();

        return nextNoteID;
    }

    public static Guid PreviousCaseNoteID(int personID, DateTime? insertDate)
    {
        var context = new MatrixDataContext();

        Guid nextNoteID = (from caseNote in context.tblCaseNotes
                           where caseNote.PersonID == personID && caseNote.InsertDate < insertDate
                           orderby caseNote.InsertDate
                           select caseNote.CaseNoteID).Skip(1).FirstOrDefault();

        return nextNoteID;
    }

3 个答案:

答案 0 :(得分:2)

嗯,最明显的问题是你正在创建一个匿名类型的实例。试试这个:

public static IQueryable<Guid> NextCaseNoteID (int personID)
{
    var context = new MatrixDataContext();

    IQueryable<Guid> nextNoteID = (from caseNote in context.tblCaseNotes
                                   where caseNote.PersonID == personID
                                   orderby caseNote.InsertDate
                                   select caseNote.CaseNoteID).Skip(1).Take(1);

    return nextNoteID;
}

我完全不确定这是你真正想要的,但它至少可以编译......

您确定不想返回实际GUID 而不是IQueryable<Guid>吗?

您可能需要拨打FirstOrDefault()而不是Take(1) ...

编辑:好的,所以它 会返回一个GUID ...你说它不起作用,但 它不起作用。如果你想获取下一个案例注释,你应该很可能传递案例注释ID而不是人员ID,但它并不是非常清楚......

答案 1 :(得分:1)

如果想要下一个/上一个方法,你现在不应该告知现在的位置是什么吗? 然后为next和currentPosition - 1跳过currentPosition + 1。

我通常使用Single()而不是FirstOrDefault()。但我认为这没什么区别。

答案 2 :(得分:0)

我可能听起来像个白痴。但是,为什么不能使用datareader来做这件事(特别是当你使用linq到sql时,后者又调用SQL Server来执行此操作)?

如果我完全误解了这个问题,请告诉我。