我的控制器有不同的方法使用由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();
}
}
答案 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请求到达时。换句话说,假设每次变量使用时都会调用它并不完全正确。