C# LINQ to实体无法识别该方法(尝试获取上一条和下一条记录)

C# LINQ to实体无法识别该方法(尝试获取上一条和下一条记录),c#,asp.net-mvc,linq,entity-framework,C#,Asp.net Mvc,Linq,Entity Framework,我试图获取上一条和下一条记录,但在运行时遇到异常。我做错了什么?我在网上找到了解决我问题的办法。我知道基本的想法,但是我对LINQ不是很有经验 LINQ to Entities在[报告(System.LINQ.IQueryable1[CXW\u DAQ\u Web.Models.Report]SkipWhile[报告(System.LINQ.IQueryable1[CXW\u DAQWeb.Models.Report],System.LINQ.Expressions.Expression1[Sy

我试图获取上一条和下一条记录,但在运行时遇到异常。我做错了什么?我在网上找到了解决我问题的办法。我知道基本的想法,但是我对LINQ不是很有经验

LINQ to Entities在[报告(System.LINQ.IQueryable1[CXW\u DAQ\u Web.Models.Report]SkipWhile[报告(System.LINQ.IQueryable1[CXW\u DAQWeb.Models.Report],System.LINQ.Expressions.Expression
1[System.Func
2[CXW\u DAQ
\u Web.Models.Report,System.Boolean])]时无法识别方法''方法,并且无法将其方法转换为存储表达式

这是我的相关代码

        var NextRecord = db.Reports.OrderBy(i => i.ID)
                    .SkipWhile(i => i.ID != id)
                    .Skip(1)
                    .First();
        int nextID = NextRecord.ID;

        var PrevRecord = db.Reports.OrderBy(i => i.ID)
                .Reverse()
                .SkipWhile(i => i.ID != id)
                .Skip(1)
                .Last();
        int prevID = PrevRecord.ID;

错误消息试图告诉您的是,LINQ to Entities无法将
IEnumerable.SkipWhile()
方法转换为SQL。您首先必须强制查询的其余部分首先使用LINQ to对象:

var nextRecord = 
    db.Reports.OrderBy(i => i.ID)
              .AsEnumerable()
              .SkipWhile(i => i.ID != id)
              .Skip(1)
              .First();                   

这里明显的缺点是整个表将被排序,然后读入内存。

那么为什么
SkipWhile(IQueryable src,…)
此处失败?这并不明显。@Colonel26最好的方法是分别运行两个查询,一个类似于以下示例:
选择top 1*…where ID
,然后另一个类似于:
选择top 1*…where ID>ID order by ID ASC
。这样,您就可以让数据库为您和您完成所有的工作使用尽可能小的内存。我把翻译成LINQ作为练习留给您。@Colonel26看起来您知道当前记录的ID(至少我在您的两个查询中看到了一个
ID
参数)。我建议您使用该ID仅从数据库中检索上一条记录和下一条记录。是的,
select top 1
一次只返回一条记录,但比Justin的解决方案效率更高。如果数据库的ID列上有索引,则可能会使用该索引查找准确的2条记录您正在以最有效的方式(索引搜索)查找的。Justin的解决方案仅适用于小表。@CLONEL26 LINQ版本应该类似于:
var next=db.Reports.Where(x=>x.ID>ID).OrderBy(x=>x.ID).First();
var previous=db.Reports.Where(x=>x.IDx.ID).First()
其中
id
是当前记录的id。@Icarus谢谢,我应该早点报告回来。我花了大约20分钟的时间来处理它,但是的,这正是我最终得到的结果。你试过编译下一条记录吗?I.o.w.你有没有收到1或2个错误?我在运行时有一个错误。它从来没有到t他回答了这个问题。