これは初めての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();
}
私は各コードに数字を記してありますので、それらを参照してください。以下は私が何が起こっていると思うかです。
ここでは
.ToList()
を呼び出しているので、これはクエリを実行します。これは
IQueryable
を返します。これはデータベースに対してクエリを実行しません。これは、(2)のクエリを実行します。
私は
.ToList()
を呼び出しているので、これは別のクエリを実行します。
どのように真実に近いですか?これはすべて正しいのでしょうか?これが意味をなさないのであれば、クエリを実行するサンプルを与えることができますか?
1つの質問で非常に多くの質問をしていただきまして申し訳ありませんが、これはすべて1つのトピックについてですので、あまり多くの質問を作成する必要はありません。
「エンティティフレームワークが正しく機能する方法を理解しようとしています」 - どれくらいの時間がかかりました! – Nick
_ "これらの断片のそれぞれについて、彼らがデータベースクエリを実行するかどうかを説明してください" _(私のあなたの解釈は)有用な質問ではありません。別のコードを書いたら、新しい質問をしますか?代わりに実際に答えたい質問をしてください。 – CodeCaster
@ CodeCaster私はちょうどクエリがデータベースに対していつ実行されるのか把握したいと思う。私はEFの新しいブランドなので、何が起こるのか分かりません。 1つにまとめると3つのクエリを実行する必要はありません。 – RandomStranger