【问题标题】:How to optimise ASP.NET MVC controller to minimise the number of database query如何优化 ASP.NET MVC 控制器以最小化数据库查询次数
【发布时间】:2014-07-18 02:10:00
【问题描述】:

我的控制器有不同的方法,它们使用由 LINQ 查询调用的存储过程返回的相同结果, 有没有办法在只调用一次过程后创建一个包含结果的全局变量??

我尝试创建一个构造函数,但每次使用变量 (ListePays) 时都会执行一个新查询

public class BUController : Controller {
    private NAV_MAUIEntities db = new NAV_MAUIEntities();
    public DbSet<liste_pays> ListePays;
    public BUController() {
        ListePays = db.liste_pays();
    }
    public JsonResult BillPh(string Pays) {
        var x = from pays in ListePays
            where pays.Pays.ToUpper() == Pays.ToUpper()
            select pays.code_pays;
        string CodePays = x.FirstOrDefault().ToString();
    }
    public JsonResult BillPh2(string Pays) {
        var x = from pays in ListePays
            where pays.Pays.ToUpper() == Pays.ToUpper()
            select pays.code_pays;
        string CodePays = x.FirstOrDefault().ToString();
    }
}

【问题讨论】:

    标签: c# mysql asp.net sql linq


    【解决方案1】:

    如果所有方法都作为处理同一 HTTP 请求的一部分被调用,只需确保某个中心参与者(例如操作方法)调用该过程并将结果传递给每个方法。

    public ActionResult MyAction()
    {
      var data = db.liste_pays();
      Method1(data);
      Method2(data);
    
      return View();
    }
    

    另一方面,如果您想在 HTTP 请求之间共享结果,您可以在多个位置缓存过程调用的结果(这不是一个详尽的列表):

    由于不了解您的具体情况,我无法推荐其中一种。但是,请注意,后两个选项可能会在用户之间共享数据,这可能是您想要的,也可能不是。

    注意:就目前的代码而言,对db.liste_pays() 的调用在BUController 的构造函数中,因此每次创建控制器时都会调用它,也就是说,每个新的传入 HTTP 请求到达的时间。换句话说,您认为每次使用变量时都会调用它的假设并不完全正确。

    【讨论】:

      【解决方案2】:

      首先,ASP.NET MVC 控制器不需要构造函数。 你所做的,意味着每次用户调用这个控制器时,都会调用数据库来检索你所有的“支付”。

      我假设您使用的是实体框架。而你使用 Linq 的方式是“LinqToEntities”。不用担心您的数据库调用,这些调用由实体框架管理。

      所以,现在,您只需要以这种方式使用 linq:

      public JsonResult BillPh(string Pays)
      {
          string codePays = db.liste_pays.FirstOrDefault(f => 
                                                     f.Pays.ToUpper() == Pays.ToUpper())
                                                      .CodePays.ToString();
      }
      

      查询的语法称为“Lambda 表达式”。

      祝你好运;-)

      【讨论】:

      • 谢谢,但是如果我有另一个方法需要使用 db.liste_pays() 的结果,而不是再次调用存储过程,我想将结果一次性放入变量 ListePays直接使用
      • 那你为什么要把它存储在你的数据库中呢?如果它几乎不需要更改,您可以在 .obj 文件中序列化您的对象“ListePays”。
      • 每次结果都不一样。
      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多