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