-1

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

我有以下代码:

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

其中 db 是数据库上下文,而 credit cards 是该数据库中的表。

这可能会导致返回多条记录,然后我使用 foreach 对其进行迭代。当有记录要返回时,一切都很好。

但是,有时不会返回任何记录,并且我收到“序列不包含元素”错误。我不想使用 FirstOrDefault 或 SingleOrDefault,因为如果返回所有记录,我想要它们。但是,如果没有返回记录,我终生无法弄清楚当我需要 null 时我会使用什么等价于这些函数。

如果解决方案不简单,我不会感到惊讶。有时 c# 似乎过于复杂。

编辑:最后我发现错误是由上下文中的 SaveChanges 方法引发的,而不是分配语句或迭代块。使用 Any 关键字最终使我发现了我的问题,因此即使结果证明这是一个单独的问题,我也将该答案标记为正确。但是感谢大家的帮助。

4

3 回答 3

2

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

于 2013-08-13T22:32:18.150 回答
2

如果序列包含元素,则 Any() 方法将为真。使用数据库时,通常比使用 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
    {
    }
}
于 2013-08-13T22:33:36.420 回答
2

您可以毫无问题地对其进行迭代:

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

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

if (currcard.Any()) // won't throw
于 2013-08-13T22:34:24.610 回答