2009-09-01 8 views
27

X個のレコードしか取れないように結果をフィルタリングしたい。 Take()はどうやって動くのだろう?このサイトではLinq Take()question

私が見つかりました:http://www.hookedonlinq.com/TakeOperator.ashx

をそれは(テイク言う) "ソースがnullの場合例外ArgumentNullExceptionをスローします。"だから何をすべきか? Take()を行うたびに、そのテーブルにいくつかのレコードがあるかどうかを保証することはできません。

私は最初にカウントを行う必要がありますか?次に、取得するレコードがいくつかあることを確認する別のクエリを実行しますか?

また、私はTake(2)を持っていますが、1つのレコードだけがこの同じ例外をスローするとどうなりますか?

答えて

42

null参照と空のコレクションには違いがあります。 Takeを空のコレクションに呼び出すのは問題ありません。また、引数には最大数を指定するので、コレクションに項目があるよりも多く指定することもできます。

このような詳細については、MSDNを参照することをお勧めします。オブジェクトへのLINQのために

List<MyObject> myList = null; 
myList.Take(5); // this would produce the error, of course 

:データベースへのリンクはhttp://msdn.microsoft.com/en-us/library/bb503062.aspx

:次のようなオブジェクトのソースに対してあることを行っている場合にのみhttp://msdn.microsoft.com/en-us/library/bb300906.aspx

+0

、それはすべての結果を取るか、結果の数を制限するために離れてありますか?特定の条件に依存するだけのように、私は結果の数を制限したいのですが、これを分割しなければなりませんか? – chobo2

+1

@ chobo2:それはまさにそれがすでにしていることです。 5つの項目を要求しても3つしかない場合は、すべて3になります。 –

9

参照例外をゼロでありますLinqをSQLに変換すると、null参照ではなく、データのEMPTY列挙子が返されます。同じように、利用可能な以上のものを取ろうとしている場合は、利用可能な額だけを使います。私はこのメソッドを使ってデータをページ化しますが、リストよりも多くのレコードを要求するときは、かなりの時間を要します。

+0

'null'のメソッドを呼び出すと、NullReferenceExceptionがスローされます。 Takeメソッドを静的メソッドとして呼び出すと、ArgumentNullExceptionがスローされます: 'List list = null; Enumerable.Take(list、5);「 – knittl

2

Takeを呼び出すオブジェクトがnullの場合、Takeは例外を介して処理を行います。あなたはヌルオブジェクトを持たないでしょうし、行がなくても同じではありません(私はあなたがセマンティクスを理解していると確信しています)。

あなたはWhere返すゼロの結果の場合は

Context.MyTable.Where(x => x.ID > 0).Take(2); 

のファッションにおけるSQLコンテキストとクエリにLINQのを使用している場合は、あなたのクエリはまだしていないので、あなたは、ヌル例外を取得することはありません実行された場合、結果が1つしかない場合は、結果が1つだけ戻されます。 Takeは、レコードが返す量を制限します。あなたは)(テイク前

+0

」Whereの結果が0の場合、クエリはまだ実行されていないため、null例外は発生しません。'Where'が結果を返さない場合、空のシーケンスを表すオブジェクトへのnull以外の参照を返すので、null例外は発生しません。 –

0

は、アイテムの数を数える:

List<string> a = new List<string>(); 
      int count = a.Count > 12 ? 12 : a.Count; 
      a.Take(count); 
+0

これは不要です。 [documentation](https://msdn.microsoft.com/en-us/library/bb503062(v=vs.110).aspx)から: "Take "は 'source'を列挙し、' count'まで要素を出力します。要素が生成されたか、または 'source'はそれ以上の要素を含んでいません。' count'が 'source'の要素の数を超えると、' source'のすべての要素が返されます。 –