C# 在IQueryable上建立索引是否可以不转换为List?

C# 在IQueryable上建立索引是否可以不转换为List?,c#,linq,asp.net-core,razor-pages,C#,Linq,Asp.net Core,Razor Pages,我有一个Razor Pages web应用程序,其中我的onget方法有一个LINQ查询,可以查找不超过5条记录的集合(我的源代码是我创建的非常大的SQL视图): IQueryable ShipmentQtys=\u MyContext .MaxShipmentEntries .其中(m=>m.PartNo==currentPart) .选择(m=>m.ShipQty); 速度很快,但问题是我需要对结果进行索引。我知道我需要改用.ToList(),但这大大降低了我的加载时间,我假设这是因为我的

我有一个Razor Pages web应用程序,其中我的onget方法有一个LINQ查询,可以查找不超过5条记录的集合(我的源代码是我创建的非常大的SQL视图):

IQueryable ShipmentQtys=\u MyContext
.MaxShipmentEntries
.其中(m=>m.PartNo==currentPart)
.选择(m=>m.ShipQty);
速度很快,但问题是我需要对结果进行索引。我知道我需要改用.ToList(),但这大大降低了我的加载时间,我假设这是因为我的视图很大,所以我一直在思考如何解决这个问题

我需要索引它,以便在我在应用程序中定义的5个字段中显示每条记录(最多5条)。一篇帖子建议使用.ElementAt,但LINQ不支持

ShipQtyField1=ShipmentQtys[0];
ShipQtyField2=ShipmentQtys[1];
//等等。

在我的情况下,是否有其他方法可以索引IQueryable(或IEnumerable)或索引的替代方法?

您可以使用select重载访问索引

  var tmp = new <yourtype>[i];
  ShipmentQtys.Select((x,i) => tmp[i] = x);
对于专用变量,我建议使用后一个版本


但是,随机访问是不可能的,它始终只是连续访问。

.Take(5).ToList()
?这总是有点慢,因为只有在开始枚举值时,才实际执行(或编译+执行)查询。但是,是的,还有其他方法可以使用可查询或可枚举。或者,如果您说您的查询只能返回五个结果,并且第二次运行时仍然很慢(即EF缓存查询计划后),那么我会检查您的查询在SQL中是否真的运行得很快,例如,您是否为partNo列编制了索引?执行计划在SSMS中是什么样子的?是否有表扫描?当您通过索引而不是先
ToList()
对其进行扫描然后使用索引来访问记录时,您希望发生什么情况?你认为这样会更快吗?好的:那是因为在输入ToList之前,你实际上并没有运行数据库查询。
  var e = ShipmentQtys.GetEnumerator();
  if (e.MoveNext())
     ShipQtyField1 = e.Current;
  if (e.MoveNext())
     ShipQtyField2 = e.Current;