シーケンスに要素が含まれていませんか?


131

現在、データベースから行を取得するために2つの場所で単一のクエリを使用しています。

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).Single();

行を取得してテキストボックスにデータを配置する場合、クエリは問題ありませんが、行を取得して編集し、データベースに戻すときに、「シーケンスに要素が含まれていません」というエラーが返されます。あるインスタンスで適切な行が見つかり、別のインスタンスでは見つからない理由を理解できません。

(ASP.NET MVCおよびLINQを使用)


18
SingleOrDefaultを使用する必要があります。アイテムが返されない場合はnullを返します
Mahmoud Farahat

このエラーは、dc.BlogPostsでIDの値と一致するアイテムが見つからないことを示しています。IDに値がないか、リスト内のアイテムにそのアイテムが含まれています。SingleOrDefaultまたはFirstOrDefaultを使用してください。これらは、エラーではなくアイテムが見つからない場合、nullオブジェクトを返します。
prd82

回答:


32

どちらの場合も、その行にブレークポイントを置くか、その前にDebug.Printを置き、IDに何が含まれているかを確認します。


2
それを行い、何らかの理由で、IDと日付が編集ページからnull \ new(0000-0000)として渡されていることがわかりました。ページはBlogPostとして強く型付けされています。編集ページには、タイトルとコンテンツのテキストボックスしかありません。IDと日付がページに表示されません。これがnull \ newとして渡される理由ですか?

2
IDがどこから来ると思っていましたか?
ライアンランディ

8
後ろを向いて、私は本当にわかりません> _ <愚かな問題は本当に。

367

LINQエラーの修正:シーケンスに要素が含まれていません」から:

「シーケンスに要素が含まれていません」というLINQエラーが発生した場合、これは通常、and ではなくFirst()or Single()コマンドを使用していることが原因です。FirstOrDefault()SingleOrDefault()

これは、次のコマンドによっても発生する可能性があります。

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • Aggregate()

3
これで問題が解決しました。リンクをありがとう!
CountMurphy、2012年

5
パーフェクト! ctx.Rosters.First(c => c.RosterAccess == accCode);<-壊れたctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<-動作しました
Ravi Ram

2
私の場合Max、空のシーケンスを超えていました
guzart 2013

1
これで、各賛成票の重量が(現時点では)31.25ポンドであることがわかりました。
B.クレイシャノン

2
それLastOrDefault()がそのエラーをトリガーすることもできますか?どうして ?「OrDefault」がすべてのポイントであると思いました
ロブステ

22

使ってください

.FirstOrDefault()

結果の最初の行に情報がない場合、この命令はデフォルトの情報に行きます。


2
非同期呼び出しの場合は、.FirstOrDefaultAsync();を使用します。
Andrea Girardi

12

さて、IDここは何ですか?特に、それはローカル変数ですか?スコープ/キャプチャの問題がいくつかあります。つまり、クエリに対してのみ、2番目の変数のコピーを使用することが望ましい場合があります。

var id = ID;
BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == id
                 select p).Single();

また; これがLINQ-to-SQLの場合、現在のバージョンでは、次の形式を使用すると、動作がわずかに向上します。

var id = ID;
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id);

IDは、引数として渡されるGUIDです

10

これで問題が解決します

var blogPosts = (from p in dc.BlogPosts
             where p.BlogPostID == ID
             select p);
if(blogPosts.Any())
{
  var post = post.Single();
}

8

言われた他のすべてに加えて、あなたが呼び出すDefaultIfEmpty()前に呼び出すことができますSingle()。これにより、シーケンスに何かが含まれることが保証され、InvalidOperationException "シーケンスに要素が含まれていません"が回避されます。例えば:

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).DefaultIfEmpty().Single();

2

平均を計算する関数についても同様の状況がありました。

例:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();

解決したケース:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();

1

エラーの理由:

  1. クエリfrom p in dc.BlogPosts where p.BlogPostID == ID select pはシーケンスを返します。

  2. Single() 手順1で返されたシーケンスから要素を取得しようとします。

  3. 例外によると -手順1で返されたシーケンスには要素が含まれていません。

  4. Single()は、手順1で返された、要素を含まないシーケンスから要素を取得しようとします。

  5. Single()は、手順1で返されたシーケンスから単一の要素をフェッチできないため、エラーをスローします。

修正:

クエリを確認してください (from p in dc.BlogPosts where p.BlogPostID == ID select p)

少なくとも1つの要素を持つシーケンスを返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.