如何优化ASP.NET MVC控制器,尽量减少数据库查询的数量

本文关键字:数据库 查询 控制器 何优化 优化 MVC NET ASP | 更新日期: 2023-09-27 18:05:32

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

如何优化ASP.NET MVC控制器,尽量减少数据库查询的数量

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

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

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

  • 在ASP。净会话
  • 在静态变量中在System.Web.Caching.Cache

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

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

首先,在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表达式"。

祝你好运!