如何优化ASP.NET MVC控制器以最小化数据库查询的数量

时间:2014-05-28 17:54:53

标签: c# mysql asp.net sql linq

我的控制器有不同的方法使用由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();
    }
}

2 个答案:

答案 0 :(得分:1)

首先,不需要构造函数进入ASP.NET MVC控制器。 你做了什么,意味着每次用户拨打这个控制器时,都会打电话给数据库以检索你所有的&#34;付费&#34;。

我假设您正在使用Entity Framework。你使用Linq的方式是&#34; LinqToEntities&#34;。不要担心您的数据库调用,这些调用由实体框架管理。

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

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

该查询的语法称为&#34; Lambda表达式&#34;。

祝你好运; - )

答案 1 :(得分:1)

如果这些方法都被称为处理相同HTTP请求的一部分,那么只需确保某个中心actor(例如,action方法)调用该过程并将结果传递给每个方法。

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

  return View();
}

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

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

注意:正如您的代码所处,db.liste_pays()的调用位于BUController的构造函数内,因此每次创建控制器时都会调用它,也就是说,每次新的传入HTTP请求到达时。换句话说,假设每次变量使用时都会调用它并不完全正确。