シナリオ:
ユーザーがいます。各ユーザーは記事の「作成者」になることができます。(記事には、共同作業を行う複数の「作成者」が含まれる場合があります。)
名前でユーザーを検索するための GUI インターフェイスを提示したいと考えています。記事を持っている著者には記事へのリンクがあるリストが表示されますが、ゼロの著者はリンクなしで表示されます。
実装:
クライアント用の検索インターフェイスを提示します。彼らは検索文字列を UserSearchForArticlesList-controller に送信し、検索クエリに一致する名前を持つすべてのユーザーを EF に要求し、このリストをビューに送信しました。
ビューは、ユーザーのリストを反復処理します。それぞれについて、公開されているドキュメントがあるかどうかを確認します (ユーザー <-> 記事の接続テーブル、EF はこれを表示せずにこれを解決できることを知っていますが、それが現在の方法です)。ユーザーが公開記事への接続を持っている場合、ActionLink を作成し、公開記事をカウントし、このカウントをリンクで表示します。
コントローラー (View で必要なデータを熱心にロードしない場合):
[HttpGet]
public ActionResult UserSearchForArticlesList(string searchTerm)
{
var model = myEF.Users.Where(x => x.Name.Contains(searchTerm)).OrderBy(x => x.Name).ToList();
return View("Index", model);
}
意見:
@foreach (var item in Model)
{
if (item.UserArticles.Any(o => o.Article.IsPublic))
{
<li>@Html.RouteLink(item.Name, "UserArticles", new { item.Id }) (@item.UserArticles.Count(o => o.Article.IsPublic))</li>
}else
{
<li title="No public articles for this User">@item.Name</li>
}
}
問題:
ユーザーの関係を遅延読み込みすると、リストに表示されている各ユーザーに対していくつかの呼び出しが発生します。(.Inlude(user => user.UserArticles.Articles)) を熱心にロードすると、呼び出しは 1 つしかありませんが、実際に必要なデータが多くなります。
合理的な量の DB 呼び出しのみを使用して、EF に一致するユーザーとそのユーザーの接続された公開記事の数を取得することは可能ですか?
「私の問題について大きな記事を書いた直後」-洞察:
EFプロファイラーをデバッグして見ていると、実際には、if句とビューのカウントの両方がDBへの単一行クエリを大量に発生させていることに気づきました。どうしてこれなの?EF は、このためにいくつかの縮小された SQL クエリを見つけ出すべきではありませんか?
アップデート:
私は明らかに、これについて情報に基づいた質問をするのに十分な EF の経験がありませんでした。上記の投稿の問題の 1 つは、ビューで反復する前に IQueryable を列挙しないため、各ステップで SQL 要求が行われることです。ただし、主な問題はまだ大規模です。