设想:
我有用户。每个用户都可以是文章的“作者”。(一篇文章可以有多个合作的“作者”。)
我想提供一个 GUI 界面来按名称搜索用户。您将看到一个列表,其中有任何文章的作者都有指向他们文章的链接,而那些为零的作者仍然会显示但没有链接。
执行:
我为客户端提供了一个搜索界面。他们将搜索字符串发送到我的 UserSearchForArticlesList 控制器,在那里我向 EF 询问名称与搜索查询匹配的所有用户,并将此列表发送到我的视图。
该视图遍历用户列表。对于每一个,它都会检查它是否有任何公开的文档(用户<->文章的连接表,我知道 EF 可以在不使其可见的情况下解决这个问题,但现在就是这样。)如果用户与公共文章有连接,它会创建一个 ActionLink,对公开文章进行计数,并通过链接显示此计数。
控制器(无需在视图中急切加载所需数据):
[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)) 时,我只接到一个电话,但是我确实需要大量数据。
您是否有可能仅使用合理数量的数据库调用就可以让 EF 获取匹配的用户以及该用户连接的公共文章的数量?
“刚刚写了一篇关于我的问题的大文章”-insight:
实际上,在调试和查看 EF 分析器时,我发现 if 子句和视图中的计数都会导致对数据库的大量单行查询。为什么是这样?EF 不应该为此找出一些缩小的 SQL 查询吗?
更新:
我显然没有足够的 EF 经验来对此提出明智的问题。我上面的帖子中的一个问题是,我在视图中迭代 IQueryable 之前没有枚举它,因此它会为每个步骤发出一个 SQL 请求。尽管如此,主要问题仍然存在。