EF - 通过急切加载获取有关相关实体的元数据,以避免额外的数据库调用

时间:2013-08-26 17:28:07

标签: c# asp.net-mvc entity-framework linq-to-entities

情景:

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

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

  3. 实施

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

    2. 视图遍历用户列表。对于每一个它检查它是否有任何公开的文件(用户&​​lt; - >文章的连接表,我知道EF可以解决这个问题而不会使其可见,但现在就是这样。)如果用户有公共连接文章,它创建一个ActionLink,计算公共文章并通过链接显示此计数。

    3. 控制器(在视图中没有任何急切加载所需数据):

      [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 =&gt; user.UserArticles.Articles))时,我只得到一个调用,但是实际需要的是大量数据。

      是否有可能以某种方式获得EF以仅使用合理数量的数据库调用来获取匹配的用户以及该用户的已连接公共文章的数量?

      “在写了一篇关于我的问题的大文章之后”-insight:

      它实际上只是在调试和查看EF分析器时遇到了if-clause和View中的计数导致DB的大量单行查询。为什么是这样? EF不应该为此找出一些缩小的SQL查询吗?

      更新

      我显然没有足够的EF经验来对此提出明智的问题。我上面的帖子中的一个问题是我在查看之前没有枚举IQueryable,因此它会为每个步骤发出一个SQL请求。虽然,主要问题仍然存在。

1 个答案:

答案 0 :(得分:0)

有两种方法可以禁用LazyLoading。

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

和第二种方式,使用没有虚拟世界的UserArticles列表。

public class User 
{ 
    public ICollection<UserArticle> UserArticles { get; set; } 
}