【问题标题】:LINQ | ArgumentOutOfRangeException: Index was out of range林克 | ArgumentOutOfRangeException:索引超出范围
【发布时间】:2018-02-10 11:40:26
【问题描述】:
for (int i = 0; i < intFeatureIDs.Count; i++) {
    slots_for = slots_for.Where(s => s.featureSlotMapping.Any(fsm => fsm.featureID == intFeatureIDs[i]));
}

这里,intFeatureID.Count 为 2。并抛出异常。

例外:

消息=尝试评估 LINQ 查询参数表达式时引发异常。要在覆盖 DbContext.OnConfiguring 时显示附加信息,请调用 EnableSensitiveDataLogging()。

内部异常 1: ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。

如果 intFeatureIDs.Count == 1,则没有问题。

另外,如果我注释掉 for 循环,并手动运行两次代码,它会起作用...

slots = slots.Where(s => s.featureSlotMapping.Any(fsm => fsm.featureID == intFeatureIDs[1]));
slots = slots.Where(s => s.featureSlotMapping.Any(fsm => fsm.featureID == intFeatureIDs[2]));

非常感谢任何 cmets。

【问题讨论】:

  • 您好 mjwills,感谢您的及时回复。但是slots_for是IQueryable类型,而toTlist()返回List……不行……
  • intFeatureIDs 到此结束...我没有任何其他代码触及这个变量了...
  • LINQ的延迟评估会忽略for循环中的变量吗?这是你暗示的吗?
  • 检查一下。
  • 你就是男人!!!我明白了,“i”仅在 for 循环中可见。延迟时,价值丢失。非常感谢!!!

标签: c# entity-framework linq


【解决方案1】:

我建议将代码更改为:

for (int i = 0; i < intFeatureIDs.Count; i++) {
    var bob = intFeatureIDs[i];
    slots_for = slots_for.Where(s => s.featureSlotMapping.Any(fsm => fsm.featureID == bob));
}

这修复了您的代码中的modified closure 问题,并可能使您的代码与可能更改/重新分配intFeatureIDs 的其他代码(未在您的示例中显示)隔离。

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多