11

Linq to SQLで使用した場合のFirstOrDefault()のデフォルトの動作は何ですか?

例えば

  int value =   (from p in context.tableX         
                select p.Id).FirstOrDefault()      // Value will initialized here or

   if(value > 0)                      // query will be executed here????
   {
    //do something
   }

ありがとう

4

4 に答える 4

12

Linq to SQLで使用した場合のFirstOrDefault()のデフォルトの動作は何ですか?

クエリの結果を積極的に計算します。これについて考える最も簡単な方法は、戻り値の型がであり、 が呼び出されるまで延期することはできintませんIEnumerable<int>が、そのようなメカニズムがないことを理解することです。GetEnumeratorint

あなたの質問の言い回しは、この動作を変更する方法があるかどうかも尋ねていることを示唆しています。FirstOrDefaultLINQ内のメカニズムはありますが、直接または何らかのメカニズムを介してではありません。ただし、を使用して延期できますLazy<T>。便利なコンパイラはありません。これがコンパイルされない場合は許してください。

Lazy<int> value = new Lazy<int>(
    () => {
        var query =
            from p in context.tableX
            select p.Id;
        var result = query.FirstOrDefault();
        return result;
    }
);

if(value.Value > 0) { // execution will be deferred until here
    //
}
于 2013-05-31T14:56:41.723 に答える
11

単一の列挙不可能な結果を​​返すすべての標準 Linq 演算子は、 query が宣言された時点ですぐに実行されます。そのため、FirstOrDefaultCountSumおよび単一の値を返すその他の演算子はすぐに実行されます。

MSDN の素敵な記事、実行方法による標準クエリ演算子の分類は次のとおりです。

于 2013-05-31T14:59:02.860 に答える
2

熱心な読み込み!

あなたがそれについて考えるならば、それはプレーンを返すだけですint- anintはおそらく "a way to go and get a " を表すことはできませんint。(そのLazy<int>ためです…)

于 2013-05-31T14:50:21.027 に答える
2

列挙可能な結果で拡張メソッドを使用すると、一括読み込みになります。これらの拡張メソッドを使用しない場合、遅延読み込みになり、linq の結果を列挙するまで実際に値を取得することはできません。

于 2014-09-01T10:50:53.543 に答える