4

where条件が最初に真になった後でクエリを停止することは可能ですか?

時間が大きい最初のレコードだけを取得したいtimeParameter。私が今持っているのは:

var records = from rec in table
              where rec.time > timeParameter
              select rec;
return records.FirstOrDefault();

データベースの時間列は昇順で並べ替えられるため、where条件が初めてtrueになると、クエリを続行する必要はありません。データベースにたくさんの行があるので、クエリをできるだけ早く停止したいと思います。

4

2 に答える 2

2

現在のコードは、あなたが求めていることを行います。

.FirstOrDefault()メソッドが短絡します。この場合、 で始まる SQL クエリが生成されSELECT TOP 1 ...ます。SQL Server エンジンは、最初の項目を見つけた後に評価を停止できることを認識しています。

あなたが言う時:

データベースの時間列は昇順で並べられています...

テーブル全体が時間列で昇順に並べられているということですか? その場合、これらの要素の自然な順序はおそらく正しいでしょう。それにもかかわらず、私はそこにステートメントを投げて、order byあなたが望む順序を確実に得られるようにします. 最悪のケースは、クエリ エンジンが不要として破棄することです。

var records = from rec in table
              where rec.time > timeParameter
              order by rec.time
              select rec;
return records.FirstOrDefault();
于 2012-04-26T14:29:31.893 に答える
2

これは実際に停止する必要があります。recordsIQueryableであるため、(FirstOrDefault を介して) データを要求するまで実行されません。これにより、適切な停止が追加されます。

基本的に、変数を LINQ ステートメントに割り当てるとrecords SQL の内容としてメモリに読み込まれるだけです。ただし、実際にデータにアクセスするための呼び出しを行うまで、何も評価されません。その時点で、使用している拡張メソッド (この場合) に基づいて SQL が適切に変更され、実際に実行されます。FirstOrDefault

ただし、Andrew Barber が指摘しているように、クエリは実際に を指定する必要がありますorder by。そうしないと、それなしで実行されます。(テーブルが DangerMonkey のカウンターポイントとして DB 側で本当にソートされていない限り)

          from rec in table
          where rec.time > timeParameter
          order by rec.time
          select rec;

PS。これがどのように機能するかを本当に理解したい場合は、式ツリー遅延実行を調べることができます

于 2012-04-26T14:30:03.033 に答える