2017-01-12 2 views
1

これは初めてのEntity Framework(EF)での作業です。Entity Frameworkでクエリを実行するタイミングを把握しようとしています

これは私が作業しているコードです。機能に気にしないでください。この質問では重要ではありません。

using (var db = new Context()) 
{ 
    //Check if any reviews have been given. 
    if (combinedReviews.Any()) 
    { 
     var restaurantsReviewedIds = combinedReviews.Select(rev => rev.RestaurantId); 

     //(1) 
     ratedRestaurants = db.Restaurants.Where(rest => restaurantsReviewedIds.Contains(rest.Id)) 
      .DistinctBy(rest => rest.Id) 
      .ToList(); 
    } 

    //(2) 
    var restsClose = db.Restaurants.Where(rest => db.Reviews.Any(rev => rev.RestaurantId == rest.Id)) 
     .OrderBy(rest => rest.Location.Distance(algorithmParams.Location)) 
     .Take(algorithmParams.AmountOfRecommendations); 

    //(3) 
    tempList = ratedRestaurants.Union(restsClose).ToList(); 
    var tempListIds = tempList.Select(rest => rest.Id); //Temporary list. 

    //(4) 
    restsWithAverage = db.Reviews.Where(rev => tempListIds.Contains(rev.RestaurantId)) 
     .GroupBy(rev => rev.RestaurantId) 
     .ToList(); 
} 

私は各コードに数字を記してありますので、それらを参照してください。以下は私が何が起こっていると思うかです。

  1. ここでは.ToList()を呼び出しているので、これはクエリを実行します。

  2. これはIQueryableを返します。これはデータベースに対してクエリを実行しません。

  3. これは、(2)のクエリを実行します。

  4. 私は.ToList()を呼び出しているので、これは別のクエリを実行します。

どのように真実に近いですか?これはすべて正しいのでしょうか?これが意味をなさないのであれば、クエリを実行するサンプルを与えることができますか?

1つの質問で非常に多くの質問をしていただきまして申し訳ありませんが、これはすべて1つのトピックについてですので、あまり多くの質問を作成する必要はありません。

+0

「エンティティフレームワークが正しく機能する方法を理解しようとしています」 - どれくらいの時間がかかりました! – Nick

+0

_ "これらの断片のそれぞれについて、彼らがデータベースクエリを実行するかどうかを説明してください" _(私のあなたの解釈は)有用な質問ではありません。別のコードを書いたら、新しい質問をしますか?代わりに実際に答えたい質問をしてください。 – CodeCaster

+0

@ CodeCaster私はちょうどクエリがデータベースに対していつ実行されるのか把握したいと思う。私はEFの新しいブランドなので、何が起こるのか分かりません。 1つにまとめると3つのクエリを実行する必要はありません。 – RandomStranger

答えて

2

クエリを実行しない場合は、AsEnumerableを使用できます。

ToList VS

ToListAsEnumerableは - List<T>からIEnumerable<T>変換します。 AsEnumerableToListを使用する利点は、AsEnumerableがクエリを実行しないことです。 AsEnumerableは遅延実行を保存し、しばしば無駄な中間リストを構築しません。

一方、LINQクエリの強制実行が必要な場合は、ToListがその方法です。

For Eachループをクエリ式の直後に置くことで強制実行することもできますが、ToListまたはToArrayを呼び出すと、すべてのデータが単一のコレクションオブジェクトにキャッシュされます。

ToLookupおよびToDictionaryもクエリを実行します。

演算子のリストとそれらがクエリを実行しているかどうかを調べることができます。 https://msdn.microsoft.com/en-us/library/mt693095.aspx

0

クエリごとにLinqクエリの実行が異なります。次のページを読むことをお勧めします。https://msdn.microsoft.com/en-us/library/bb738633(v=vs.110).aspx

+0

私は2番目の質問を削除します – RandomStranger

+0

あなたの答えは答えではありません、[他のところにリンクが入っている回答は本当に "良い答え"ですか?](http://meta.stackexchange.com/questions/8231/are -answers-that-just-contain-links-other-really-good-answers) – CodeCaster

+0

@CodeCasterとにかく質問が悪いです。 – ChrisBint

関連する問題