如何优化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();
}
}
如果方法都是作为同一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表达式"。
祝你好运!