トップ5を選択するLINQクエリ


234

LINQクエリがあります。

var list = from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t;

このクエリを変更して、データベースから5つの結果のみを選択するにはどうすればよいですか?


Take(how_many_you_wish)
snr

回答:


437
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

5
+1ですが、まあ、複数行の式を括弧で囲み、全体を逆参照すると、何らかの理由で本当に私に感謝します。
ジョーンズ博士、

6
これは、等価条件に一致するだけデータベースから多くの結果を取得するようであり、それらがデータベースから取得された後にのみ、アプリケーション内でtake(5)制限が適用されます。文字通りtakeデータベースの最初の5行だけにする方法はありますか?
JMヒックス'16

6
@JMHicksはそうではありません。Take(5)コマンドは、さらに別の条件をIQueryableに追加するだけで、列挙するまで実行されません。ただし、Take操作をサポートしないLINQプロバイダーが存在する場合があります。
ブルーノブラント2015

1
@JMHicks-これはlinqの動作方法ではありません... linqは遅延しています。
ホーガン

39

ソリューション:

var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

19

これは、LinqのLambdaベースのアプローチを使用して実現することもできます。

var list = ctn.Items
.Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
.OrderBy(t => t.Delivery.SubmissionDate)
.Take(5);

8

[ @Ajniが提供する回答よりもいくぶん説明的な回答を提供します。]

これは、LINQ Fluent構文を使用して実現することもできます

var list = ctn.Items
    .Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
    .OrderBy(t => t.Delivery.SubmissionDate)
    .Take(5);

注各メソッド(つまりWhereOrderByTakeこのLINQ文で表示されますがかかること)ラムダ式を引数として。また、のドキュメントは次でEnumerable.Take始まることに注意してください。

シーケンスの先頭から指定された数の隣接する要素を返します。


5

Additional information

場合によっては、モデルをビューモデルにバインドし、型変換エラーを発生させる必要があります。この状況では、ToList()メソッドを使用する必要があります。

var list = (from t in ctn.Items
       where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
       orderby t.Delivery.SubmissionDate
       select t).Take(5).ToList();

0

SQLスクリプトの場合のように、シーケンスFrom-> Where-> Selectに慣れていないように感じるかもしれませんが、これはSelect-> From-> Whereのようなものです。

しかし、Sql Engine内では、「From-> Where-> Select」のシーケンスでも解析されることを知らない場合があります。それを検証するには、簡単なスクリプトを試すことができます

select id as i from table where i=3

そして、それは動作しません、その理由は、エンジンが解析されますある場合は前に選択し、それは私がで別名を知ることができません、ので、どこ。これを機能させるために、あなたは試すことができます

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