web-dev-qa-db-ja.com

Linq Take()の質問

X量のレコードのみを取得するように結果をフィルター処理したいと思います。 Take()はどのように機能するのでしょうか。

このサイトで私は見つけました: http://www.hookedonlinq.com/TakeOperator.ashx

Take()は、「ソースがnullの場合、ArgumentNullExceptionをスローします」と述べています。だから私は何をすべきですか? Take()を実行するたびに、そのテーブルにレコードがあるかどうかは保証できません。

だから私は最初に数える必要がありますか?次に、取得するレコードがあることを確認する別のクエリを実行しますか?

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

30
chobo2

Null参照と空のコレクションには違いがあります。空のコレクションに対してTakeを呼び出すのは問題ありません。また、引数には最大数を指定するので、コレクション内のアイテム数よりも多く指定することもできます。

このような詳細については、MSDNを参照することをお勧めします。

Linq to Objectsの場合: http://msdn.Microsoft.com/en-us/library/bb503062.aspx

データベースへのリンクの場合: http://msdn.Microsoft.com/en-us/library/bb300906.aspx

47

このnull参照の例外は、次のようなオブジェクトソースに対してそれを実行している場合のみです。

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

Linq to SQLを実行すると、null参照ではなく、データのEMPTY列挙子が返されます。同じトークンで、あなたが利用可能な量よりも多く取ろうとしている場合、それは利用可能な量のみを受け取ります。この方法を使用して、場合によってはデータをページングしますが、多くの場合、リストで利用できるよりも多くのレコードを要求します。

11
Fooberichu

Takeは、それを呼び出すオブジェクトがnullの場合、例外を通過します。おそらく、nullオブジェクトはなく、行がない、または少ないということは同じではありません(セマンティクスを理解していると思います)。

Linq to SQLコンテキストを使用して、次の方法でクエリを実行している場合

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

結果が0を返すWhereの場合、クエリはまだ実行されていないため、null例外は発生しません。結果が1つしか含まれていない場合、結果は1のみになります。結果を返します。 Takeは、返されるレコードの量を制限します。

2

Take()する前にアイテムの数を数えます:

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