0

设想:

  1. 我有用户。每个用户都可以是文章的“作者”。(一篇文章可以有多个合作的“作者”。)

  2. 我想提供一个 GUI 界面来按名称搜索用户。您将看到一个列表,其中有任何文章的作者都有指向他们文章的链接,而那些为零的作者仍然会显示但没有链接。

执行:

  1. 我为客户端提供了一个搜索界面。他们将搜索字符串发送到我的 UserSearchForArticlesList 控制器,在那里我向 EF 询问名称与搜索查询匹配的所有用户,并将此列表发送到我的视图。

  2. 该视图遍历用户列表。对于每一个,它都会检查它是否有任何公开的文档(用户<->文章的连接表,我知道 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 请求。尽管如此,主要问题仍然存在。

4

1 回答 1

0

有两种方法可以禁用 LazyLoading。

第一种方式,使用属性 myEF.Configuration.LazyLoadingEnabled = false;

第二种方式,在没有虚拟世界的情况下使用 UserArticles 列表。

public class User 
{ 
    public ICollection<UserArticle> UserArticles { get; set; } 
}
于 2013-08-26T17:43:45.097 回答