C# LINQ to实体无法识别该方法(尝试获取上一条和下一条记录)
我试图获取上一条和下一条记录,但在运行时遇到异常。我做错了什么?我在网上找到了解决我问题的办法。我知道基本的想法,但是我对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.ExpressionC# 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
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他回答了这个问题。