X量のレコードのみを取得するように結果をフィルター処理したいと思います。 Take()はどのように機能するのでしょうか。
このサイトで私は見つけました: http://www.hookedonlinq.com/TakeOperator.ashx
Take()は、「ソースがnullの場合、ArgumentNullExceptionをスローします」と述べています。だから私は何をすべきですか? Take()を実行するたびに、そのテーブルにレコードがあるかどうかは保証できません。
だから私は最初に数える必要がありますか?次に、取得するレコードがあることを確認する別のクエリを実行しますか?
私がTake(2)を持っているが、1つのレコードだけがこの同じ例外をスローする場合もどうなりますか?
Null参照と空のコレクションには違いがあります。空のコレクションに対してTakeを呼び出すのは問題ありません。また、引数には最大数を指定するので、コレクション内のアイテム数よりも多く指定することもできます。
このような詳細については、MSDNを参照することをお勧めします。
Linq to Objectsの場合: http://msdn.Microsoft.com/en-us/library/bb503062.aspx
データベースへのリンクの場合: http://msdn.Microsoft.com/en-us/library/bb300906.aspx
このnull参照の例外は、次のようなオブジェクトソースに対してそれを実行している場合のみです。
List<MyObject> myList = null;
myList.Take(5); // this would produce the error, of course
Linq to SQLを実行すると、null参照ではなく、データのEMPTY列挙子が返されます。同じトークンで、あなたが利用可能な量よりも多く取ろうとしている場合、それは利用可能な量のみを受け取ります。この方法を使用して、場合によってはデータをページングしますが、多くの場合、リストで利用できるよりも多くのレコードを要求します。
Takeは、それを呼び出すオブジェクトがnullの場合、例外を通過します。おそらく、nullオブジェクトはなく、行がない、または少ないということは同じではありません(セマンティクスを理解していると思います)。
Linq to SQLコンテキストを使用して、次の方法でクエリを実行している場合
Context.MyTable.Where(x => x.ID > 0).Take(2);
結果が0を返すWhere
の場合、クエリはまだ実行されていないため、null例外は発生しません。結果が1つしか含まれていない場合、結果は1のみになります。結果を返します。 Take
は、返されるレコードの量を制限します。
Take()する前にアイテムの数を数えます:
List<string> a = new List<string>();
int count = a.Count > 12 ? 12 : a.Count;
a.Take(count);