【问题标题】:InvalidOperationException: Sequence contains more than one element - SingleOrDefault()InvalidOperationException:序列包含多个元素 - SingleOrDefault()
【发布时间】:2015-12-10 21:28:37
【问题描述】:
using (var db = new ABC())
{

for (int column = rangeClass2.Start.Column; column <= rangeClass2.End.Column; column++)
{
   var classValue = censusSheet.Cells[row, column].Value;
   var description = censusSheet.Cells[3, 27].Value;
 lifeReductionByData.Add(classASheet.getClassFromExcelPivotedValuedreductionBy<tbl_Life_Reduction_By>(25, 1, 33, 4, lifeReductionByClassMapper).FirstOrDefault());
 for (int i = 0; i < lifeReductionByData.Count; i++)
 {
     lifeReductionByData[i].Class = classesValue[x];
     lifeReductionByData[i].UUID = censusSheet.GetValue(25, 27).ToString();
 }
}
var entry = new tbl_Life_Master() { UUID = uuidVar };
entry.tbl_Life_Reduction_By = lifeReductionByData;
context.tbl_Life_Master.Add(entry);
context.SaveChanges();
}

通过在 Stack Overflow 上搜索,我很清楚 FirstOrDefault() 是避免这种情况的最佳方法。但是,如果我想在我的列表中添加多条记录,那么解决方案是什么?由于 'getClassFromExcelPivotedValuedreductionBy' 这里返回 3 条记录。请帮帮我。

【问题讨论】:

  • 如果有多个值,您希望发生什么?
  • @usr 我想将它添加到 'lifeReductionByData' 中,这是一个声明为 'List lifeReductionByData = new List();'的数据库表列表

标签: c# asp.net linq linq-to-entities invalidoperationexception


【解决方案1】:

但是如果我想在我的列表中添加多条记录,那么解决方案是什么?

您的意思是要添加所有结果?假设lifeReductionByData 是适当类型的List&lt;T&gt;,您可以只使用List&lt;T&gt;.AddRange

var query = classASheet.getClassFromExcelPivotedValuedreductionBy<tbl_Life_Reduction_By>(25, 1, 33, 4, lifeReductionByClassMapper);
lifeReductionByData.AddRange(query);
foreach (var item in lifeReductionByData)
{
    item.Class = classesValue[x];
    item.UUID = censusSheet.GetValue(25, 27).ToString();
}

注意这里使用foreach 而不是索引。现在,如果lifeReductionByData 在这段代码之前实际上是空的,并且之后您不需要它,您可以遍历查询本身:

var query = classASheet.getClassFromExcelPivotedValuedreductionBy<tbl_Life_Reduction_By>(25, 1, 33, 4, lifeReductionByClassMapper);
foreach (var item in query)
{
    item.Class = classesValue[x];
    item.UUID = censusSheet.GetValue(25, 27).ToString();
}

如果您以后确实需要该列表,但事先它是空的,那么我会使用:

var query = classASheet.getClassFromExcelPivotedValuedreductionBy<tbl_Life_Reduction_By>(25, 1, 33, 4, lifeReductionByClassMapper);
var list = query.ToList();
foreach (var item in list)
{
    item.Class = classesValue[x];
    item.UUID = censusSheet.GetValue(25, 27).ToString();
}

接下来,我将 getClassFromExcelPivotedValuedreductionBy 重命名为 a) 更简洁; b) 遵循 .NET 命名约定。

【讨论】:

  • 其实这段代码已经在循环中了。每次循环运行时,它都会添加 3 个结果。这会影响什么吗?
  • @JasneetSingh:仅从描述中很难判断。恐怕当您只给我们部分上下文时会发生这种情况……但是如果您花时间研究答案(例如阅读链接的文档)以了解正在发生的事情,您应该能够找出如何将其应用于您的情况。
  • @JasneetSingh:那你为什么要覆盖列表中所有项的ClassUUID,包括你在之前的迭代中已经编写的那些?这听起来不是一个好计划。最后,我们真的不得不对您可以实现的目标做出疯狂的猜测——而且似乎与您在问题中指定的例外情况几乎没有任何关系。
猜你喜欢
  • 2015-09-15
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多