-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() メソッドは 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
    {
    }
}
于 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 に答える