【问题标题】:Recursion in ASP.NET MVCASP.NET MVC 中的递归
【发布时间】:2015-04-03 22:13:07
【问题描述】:

来自 CakePHP 背景,现在使用 ASP.NET,我正在努力在模型中找到一个等效的功能,在 CakePHP 中称为递归。

例如,在博客应用中,帖子有作者。在 Cake 中,如果我只想检索 Post,而不是相关实体,我会将 recursive 设置为 0,并且模型只会返回该实体。如果我将它设置为 1,它也会带回第一级相关实体,所以作者姓名等。

我正在 ASP.NET 的模型中寻找类似的功能,但似乎找不到任何类似的功能,并且不断在我的 API 上获取参考循环,例如,帖子、作者、作者的帖子、帖子的作者等开。

如何限制 ASP.NET 中的递归深度?

【问题讨论】:

  • 您说的是 Web API 应用程序吗?
  • 你在使用EntityFramework吗?有我们用于急切加载的 Include 方法。更多信息在这里 - msdn.microsoft.com/en-us/data/jj574232.aspx
  • Web API 和 MVC 都使用共享模型。使用 EF 是的。

标签: c# asp.net asp.net-mvc cakephp recursion


【解决方案1】:

在实体框架中,这个概念被称为急切加载。

急切加载是对一种实体类型的查询同时加载相关实体作为查询的一部分的过程。急切加载是通过使用 Include 方法实现的。例如,下面的查询将加载博客以及与每个博客相关的所有帖子。

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 

    // Load one blogs and its related posts 
    var blog1 = context.Blogs 
                        .Where(b => b.Name == "ADO.NET Blog") 
                        .Include(b => b.Posts) 
                        .FirstOrDefault(); 

    // Load all blogs and related posts  
    // using a string to specify the relationship 
    var blogs2 = context.Blogs 
                          .Include("Posts") 
                          .ToList(); 

    // Load one blog and its related posts  
    // using a string to specify the relationship 
    var blog2 = context.Blogs 
                        .Where(b => b.Name == "ADO.NET Blog") 
                        .Include("Posts") 
                        .FirstOrDefault(); 
}

请注意,Include 是 System.Data.Entity 命名空间中的扩展方法,因此请确保您使用的是该命名空间。

欲了解更多信息,请参阅此链接:

https://msdn.microsoft.com/en-us/data/jj574232.aspx

【讨论】:

  • 谢谢。我认为没有内置的递归属性可以覆盖所有模型吗?另外,上面的代码是控制器还是模型?
  • 嗯,它实际上是内置在 EF 中的,但以显式加载(急切加载)的形式是可选的。这种模式确保您不会从数据库中加载您不需要的数据。从 DB 中获取数据是一个经常被分离到服务层并使用存储库/通用存储库等模式实现的问题。有关参考,请查看 Sharp Architecture github.com/sharparchitecture/Sharp-Architecture/tree/master/…
  • 明确地只包含您需要的关系更好。您急切加载的每个关系都需要一个单独的连接,并且连接是。在 CakePHP 的开发中决定每一个关系都应该加载的人,无论是全部还是全部,都是该死的白痴。我以前从未见过。甚至像 RoR 和 Django 这样的其他框架也可以让您明确地拉取您想要的关系。跟那个特别的垃圾功能说再见,然后继续前进。
  • 此外,EF 还允许您包含 N 深度关系。例如,您可以使用 context.Blogs.Include("Posts.Comments") 一次加入每个帖子的帖子和 cmets。
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2015-07-18
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多