2013-05-31 1 views
6

LinqからSQLへの使用時のFirstOrDefault()のデフォルトの動作は何ですか?例えばFirstorDefault()は、linqからsqlへの遅延ロードまたはeagerロードを引き起こします

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 
    } 

おかげ

+3

エンティティと 'IEnumerable'だけがlazyloadedです。 – gdoron

答えて

10

Linq to SQLで使用されるFirstOrDefault()のデフォルトの動作は何ですか?

質問の結果を熱心に計算します。これについて最も簡単に考えてみると、返品タイプがが呼び出されるまで、ではなく、であり、返品タイプはintではないことに気付くことができますが、intにはそのような仕組みはありません。

あなたの質問の表現は、この動作を変更する方法があるかどうかを尋ねていることを示唆しています。 FirstOrDefaultやLINQ内のメカニズムがありますが、直接はありません。しかし、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 
    // 
} 
+0

IEnumerableオブジェクトのFirstOrDefault()の動作よりも??? –

+1

@Iti Tyagi - FirstOrDefault()がGetEnumeratorの呼び出しを開始するかどうかを確認するような音がします。 query.FirstOrDefault()は遅延ロードまたは熱心な読み込みを行います(つまり、GetEnumeratorを呼び出すかどうか)。私はquery.ToList()のような何かが熱心な負荷を強制すると思います - FirstOrDefault()は同じですか? –

2

イーガーロード用

考えてみると、intが返されます。intは、「intに行く方法」を表すことはできません。 (それはLazy<int>のためです)

8

シングル、非可算結果を返すすべての標準のLINQ演算子は、クエリが宣言ある時点で即座に実行されています。したがって、FirstOrDefault,Count,Sumなどの単一の値を返す演算子は直ちに実行されます。ここで

は素敵なMSDNの記事は、あなたはそれが遅延ロードされ、あなたが実際にフェッチすることはできませんこれらの拡張メソッドを使用していない列挙result.If上の拡張メソッドを使用するときには、イーガーロードになりClassification of Standard Query Operators by Manner of Execution

2

です値はlinqの結果を列挙するまで

関連する問題