Linq to SQLは、TOPまたはLIMIT / OFFSETと同じですか?


回答:


146

VBの場合:

from m in MyTable
take 10
select m.Foo

これは、MyTableがIQueryableを実装していることを前提としています。DataContextまたはその他のプロバイダーを介してアクセスする必要がある場合があります。

また、Fooはプロパティ名にマップされるMyTableの列であると想定しています。

詳細については、http://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspxを参照してください。


127
これはC#では機能しません。テイク式はありません。Take()メソッドを使用する必要があります。
Adam Lassek、

10
技術的には、質問者がLinq to SQLを要求したため、VBは実行可能な仮定です。とはいえ、ALassek、私は自分自身がAC#の人なので、あなたの答えを好みます。:-)
デビッドアルパート、

3
まあ、あなたの例はC#LINQで書かれたので、私がそれを指摘したのはそのためです。
Adam Lassek、

3
2つの問題:1)これはVBで正常に動作します。C#ではTakeメソッドがあります。2)takeはdbではなくクライアントで機能するため、結果セットが大きい場合、結果セットはすべてdbからクライアントに渡されます。
結城

8
これは数年前のものですが、ここに来たばかりの人にとっては、「。Take(x)」が「.Select()」または「.ToList()」を実行する前に「 .Take(x) "は、結果を列挙する前の場合にのみ、生成されたSQLに含まれます。この後に表示される場合は、結果セットが列挙された後で行われるため、単純な古いLinqステートメントになります。
バーティ

248

Takeメソッドを使用します。

var foo = (from t in MyTable
           select t.Foo).Take(10);

VBでは、LINQにテイク式があります。

Dim foo = From t in MyTable _
          Take 10 _
          Select t.Foo

ドキュメントから:

Take<TSource>要素がsource生成されるか、要素がなくなるまで、count要素を列挙して生成しsourceます。countの要素数を超える場合source、のすべての要素sourceが返されます。


13
C#とVBの間のLINQの小さな違いは迷惑です。C#にVBのようなテイク式がないのはなぜですか?それは見落としのようです。また、VBには匿名のSubがないため、ラムダの有用性ははるかに低くなります。
Adam Lassek、

ちょうど私が探していたもの+1
jasonco 2009年

1
+1私が必要としているものも。そしてFWIWは、実際には10レコードだけがパイプラインを下りているようです。それ以外の場合、SELECTは膨大な量のデータを返します。これは、苦痛な遅延の後にOutOfMemoryExceptionをスローするのに十分です。Take(管理可能数量)を使用すると、遅延も例外もありません。
Bob Kaufman、

VBにTake()メソッドも追加されました。取得する量に変数を使用する必要があり、式が機能する一方で式が機能しませんでした。
Dave Johnson、


25

OPは実際にオフセットについても言及しています。30から60までのアイテムを取得したい場合は、次のようにします。

var foo = (From t In MyTable
       Select t.Foo).Skip(30).Take(30);

オフセットには「スキップ」メソッドを使用します。
制限には「取得」メソッドを使用します。


13

@Janei:ここでの最初のコメントはあなたのサンプルです;)

私はあなたがこれを好きなら、あなたは4を取る必要があると思います、そしてこれらの4に分類を適用します

var dados =  from d in dc.tbl_News.Take(4) 
                orderby d.idNews descending
                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                };

idNewsでtbl_News全体をソートしてから4を取るのとは異なります

var dados =  (from d in dc.tbl_News
                orderby d.idNews descending
                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                }).Take(4);

番号 ?結果は異なる場合があります。


5

これはC#でうまく機能します

var q = from m in MyTable.Take(10)
        select m.Foo

4

私はこれが好きです:

 var dados =  from d in dc.tbl_News.Take(4) 
                orderby d.idNews descending

                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                };

7
このアプローチの問題は、あなたが本当に欲しいものがトップ4の結果を得ることだと私が思うとき、あなたが4を取ってからそれらを注文することです。注文後にテイクを行う必要があります。Yannsのコメントを参照してください。
Russell Troywest


3

クライアントまたはデータベースでテイクが発生するかどうかは、テイク演算子を適用する場所によって異なります。クエリを列挙する前(つまり、foreachで使用する前、またはコレクションに変換する前)に適用すると、「上位n」のSQL演算子がデータベースに送信されます。SQLプロファイラーを実行すると、これを確認できます。クエリを列挙した後にテイクを適用すると、LINQはデータベースからデータを取得して列挙する必要があるため、クライアントで発生します。


2

並べ替えなしでデータベースのデータを取得することは、ランダムテイクと同じです。


確かにランダムではありませんが、結果が再現可能であることが保証されていませんが、特にテストの場合は、そうしたいことがたくさんあります。
Auspex 2018年

2
Array oList = ((from m in dc.Reviews
                           join n in dc.Users on m.authorID equals n.userID
                           orderby m.createdDate descending
                           where m.foodID == _id                      
                           select new
                           {
                               authorID = m.authorID,
                               createdDate = m.createdDate,
                               review = m.review1,
                               author = n.username,
                               profileImgUrl = n.profileImgUrl
                           }).Take(2)).ToArray();

0

私はTake(n)メソッドを使用し、次にリストに変換する必要がありました。

    var listTest = (from x in table1
                     join y in table2
                     on x.field1 equals y.field1
                     orderby x.id descending
                     select new tempList()
                     {
                         field1 = y.field1,
                         active = x.active
                     }).Take(10).ToList();

0

このように私にとってはうまくいきました:

var noticias = from n in db.Noticias.Take(6)
                       where n.Atv == 1
                       orderby n.DatHorLan descending
                       select n;

このサイトは英語のみであるため、ポルトガル語のテキストを英語に翻訳しました(変数名には適用されないため、変更していません)。
ワカ

ごめんなさい !私は気づかなかった、私はブラジルのスタックオーバーフローにいると思った。申し訳ありません
グラッドソンReis

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