【问题标题】:Implementing Next/Previous with LINQ to SQL使用 LINQ to SQL 实现 Next/Previous
【发布时间】:2010-11-21 10:42:16
【问题描述】:

我有下面的代码,试图让用户通过单击 WinForm 上的 Next 或 Previous 来“逐步浏览”数据库中的案例说明。它只会抓取第一个案例说明。 我做错了什么?

对此帖子进行了多次修改,我深表歉意,但按照 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;
    }

【问题讨论】:

  • 你为什么返回 iquerayble 而不仅仅是 guid?
  • @Geoff:Resharper 告诉我,但我不(不)知道更好。请参阅我在 Jon Skeet 帖子下的评论。
  • 根据您的编辑,您能否确认从 caseNote.CaseNoteID 返回的内容实际上是 32 位数字和 4 个破折号?
  • 编辑后,您尝试将IQueryable 转换为字符串。那是行不通的。
  • (我已经编辑了我的答案以提供替代方案。知道 CaseNoteID 的类型真的很有帮助...)

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


【解决方案1】:

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

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&lt;Guid&gt;

您可能想调用FirstOrDefault() 而不是Take(1)...

编辑:好的,所以它确实返回一个 GUID...你说它不工作,但不是 如何它不工作。如果您想获取下一个案例说明,您很可能应该传递案例说明 ID 而不是人员 ID,但这并不是很清楚...

【讨论】:

  • 不,我想要实际的 Guid,但我遇到了相同类型的问题,我不想用我的许多失败尝试来轰炸我的帖子。无论如何,我相信这是 Joel Splosky 的建议。就我的尝试和迭代而言,FirstOrDefault() 会做什么......谢谢
  • 实际上,我刚刚意识到我一开始尝试使用 Guid 但它不会编译,intelisense(ReSharper??) 建议我将 noteID 的类型更改为 IQueryable... .
  • FirstOrDefault 将执行查询并返回第一个结果类型的默认值(即在这种情况下为default(Guid))。
  • 是的,我现在明白了。我如何让它进入下一个和下一个?
  • 不,它不是字符串。我真的很抱歉混乱。看看我目前的编辑,我现在将不理会它,你会看到我在哪里。对不起!
【解决方案2】:

如果想要下一个/上一个方法,您不应该告知当前位置吗? 然后为 next 和 currentPosition - 1 跳过 currentPosition + 1。

我通常使用 Single() 而不是 FirstOrDefault()。但我认为这不会有什么不同。

【讨论】:

    【解决方案3】:

    我可能听起来像个白痴。但是,为什么你不能使用数据读取器来做这件事(尤其是当你使用 linq to sql 时,它又会调用 SQL Server 来做这件事)?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多