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

时间:2013-08-13 22:30:04

标签: c# linq

我是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关键字最终导致我发现了我的问题,所以尽管事实证明这是一个单独的问题,但我已将该答案标记为正确。但感谢大家的帮助。

3 个答案:

答案 0 :(得分:2)

如果序列是空的并且你对它进行迭代,则不会发生任何事情,这是你通常想要的语义(以及你正在寻找的内容)。你正在使用的迭代代码究竟是什么?对于空序列,foreach不应该有任何问题。

答案 1 :(得分:2)

如果序列包含元素,则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
    {
    }
}

答案 2 :(得分:2)

您可以毫无问题地迭代它:

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

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

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