序列不包含“可能有多个元素的查询”的元素

本文关键字:元素 查询 可能有 包含 | 更新日期: 2023-09-27 18:27:29

我是Linq和C#的新手,我花了很长时间试图解决这个非常简单的问题。

我有以下代码:

var currcard = from c in db.CreditCards where c.Id == cid select c;

其中db是数据库上下文,而信用卡是该数据库中的一个表。

这可能导致返回几个记录,然后我使用foreach对这些记录进行迭代。当有记录需要返回时,一切都很顺利。

然而,有时不会返回任何记录,并且我会得到"Sequence contains no elements"错误。我不想使用FirstOrDefault或SingleOrDefault,因为如果返回了所有记录,我就想要它们。然而,如果没有返回任何记录,当我需要null时,我一辈子都无法计算出这些函数的等价物。

如果解决方案不简单,我不会感到惊讶。有时候c看起来过于复杂。

编辑:最后,我发现错误是由上下文上的SaveChanges方法引发的,而不是赋值语句或迭代块。使用Any关键字最终让我发现了自己的问题,所以即使这是一个单独的问题,我也将答案标记为正确。但感谢大家的帮助。

序列不包含“可能有多个元素的查询”的元素

您可以在没有问题的情况下对其进行迭代:

foreach (var r in currcard) // won't throw

同样,您可以事先检查列表中是否有任何项目:

if (currcard.Any()) // won't throw

如果序列是空的,并且您对其进行迭代,则不会发生任何事情,这是您通常想要的语义(也是您想要的)。您使用的迭代代码究竟是什么?foreach对于空序列应该没有任何问题。

如果序列包含元素,则Any()方法将为true。当使用数据库时,它通常比使用Count()>0 效率高得多
var currcard = from c in CreditCards where c.Id == cid select c;
if (currcard.Any())  // do not be tempted to use currcard.Count() > 0
{
    // something with currcard; e.g.
    System.Console.WriteLine("Currcard");
    foreach(var card in currcard) // should do nothing if currcard has no elements
    {
    }
}