Asp.net mvc 如何在内存中保存数据列表?
我有一个ajax函数,由jQueryDataTable和ve调用Asp.net mvc 如何在内存中保存数据列表?,asp.net-mvc,Asp.net Mvc,我有一个ajax函数,由jQueryDataTable和ve调用 从数据库中获取数据 服务于搜索、排序、分页等功能性工作 现在我所需要的是,我只想获取一次数据并将其保存在内存中,这样当用户在搜索框中键入内容时,它就可以直接从存储的数据中执行搜索 这是代码 public ActionResult AjaxOil(JQueryDataTableParamModel param) { //To get data and should be run only onc
public ActionResult AjaxOil(JQueryDataTableParamModel param)
{
//To get data and should be run only once.
IEnumerable<Oil> allOils = _context.Oils.ToList();
//All others function.
IEnumerable<Oil> filteredOils;
if (!string.IsNullOrEmpty(param.sSearch))
{
filteredOils = allOils
.Where(c => c.CommonName.Contains(param.sSearch)
||
c.BotanicalName.Contains(param.sSearch)
||
c.PlantParts.Contains(param.sSearch)
||
c.Distillation.Contains(param.sSearch));
}
else
{
filteredOils = allOils;
}
var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]);
Func<Oil, string> orderingFunction = (c => sortColumnIndex == 1 ? c.CommonName :
sortColumnIndex == 2 ? c.BotanicalName :
c.PlantParts);
var distillationFilter = Convert.ToString(Request["sSearch_4"]);
var commonFilter = Convert.ToString(Request["sSearch_1"]);
var botanicalFilter = Convert.ToString(Request["sSearch_2"]);
var plantFilter = Convert.ToString(Request["sSearch_3"]);
if (!string.IsNullOrEmpty(commonFilter))
{
filteredOils = filteredOils.Where(c => c.CommonName.Contains(commonFilter));
}
if (!string.IsNullOrEmpty(botanicalFilter))
{
filteredOils = filteredOils.Where(c => c.BotanicalName.Contains(botanicalFilter));
}
if (!string.IsNullOrEmpty(plantFilter))
{
filteredOils = filteredOils.Where(c => c.PlantParts.Contains(plantFilter));
}
if (!string.IsNullOrEmpty(distillationFilter))
{
filteredOils = filteredOils.Where(c => c.Distillation.Contains(distillationFilter));
}
var sortDirection = Request["sSortDir_0"];
if (sortDirection == "asc")
filteredOils = filteredOils.OrderBy(orderingFunction);
else
filteredOils = filteredOils.OrderByDescending(orderingFunction);
var displayedOils = filteredOils
.Skip(param.iDisplayStart)
.Take(param.iDisplayLength);
var result = from c in displayedOils
select new[] { Convert.ToString(c.OilId), c.CommonName, c.BotanicalName, c.PlantParts, c.Distillation };
return Json(new
{
sEcho = param.sEcho,
iTotalRecords = allOils.Count(),
iTotalDisplayRecords = filteredOils.Count(),
aaData = result
},
JsonRequestBehavior.AllowGet);
public ActionResult AjaxOil(JQueryDataTableParamModel参数)
{
//要获取数据,应仅运行一次。
IEnumerable allOils=_context.Oils.ToList();
//所有其他功能。
i数不清的过滤器;
如果(!string.IsNullOrEmpty(param.sSearch))
{
filteredOils=allOils
.Where(c=>c.CommonName.Contains(param.sSearch)
||
c、 植物学名称.Contains(param.sSearch)
||
c、 PlantParts.Contains(参数sSearch)
||
c、 蒸馏.包含(参数sSearch));
}
其他的
{
filteredOils=allOils;
}
var sortcolumnidex=Convert.ToInt32(请求[“iSortCol_0”]);
Func orderingFunction=(c=>sortColumnIndex==1?c.CommonName:
sortColumnIndex==2?c.名称:
c、 植物部分);
var蒸馏过滤器=Convert.ToString(请求[“sSearch_4”]);
var commonFilter=Convert.ToString(请求[“sSearch_1]”);
var-filter=Convert.ToString(请求[“sSearch_2]”);
var plantFilter=Convert.ToString(请求[“sSearch_3]”);
如果(!string.IsNullOrEmpty(commonFilter))
{
filteredOils=filteredOils.Where(c=>c.CommonName.Contains(commonFilter));
}
如果(!string.IsNullOrEmpty(筛选器))
{
filteredOils=filteredOils.Where(c=>c.植物学名称.Contains(植物学过滤器));
}
如果(!string.IsNullOrEmpty(plantFilter))
{
filteredOils=filteredOils.Where(c=>c.PlantParts.Contains(plantFilter));
}
如果(!string.IsNullOrEmpty(蒸馏过滤器))
{
filteredOils=filteredOils.Where(c=>c.discreation.Contains(蒸馏过滤器));
}
var sortDirection=请求[“sortdir_0”];
如果(排序方向==“asc”)
filteredOils=filteredOils.OrderBy(orderingFunction);
其他的
filteredOils=filteredOils.OrderByDescending(orderingFunction);
var displayedOils=filteredOils
.Skip(参数iDisplayStart)
.Take(参数iDisplayLength);
var结果=显示仪表中的c
选择new[]{Convert.ToString(c.OilId)、c.CommonName、c.植物学名称、c.PlantParts、c.distraction};
返回Json(新的
{
sEcho=param.sEcho,
iTotalRecords=allOils.Count(),
iTotalDisplayRecords=filteredOils.Count(),
aa数据=结果
},
JsonRequestBehavior.AllowGet);
在第一次加载时,将数据保存在缓存/会话/静态字段中。在下一次搜索时,检查缓存/会话/静态字段是否为空,并从那里读取,而不是从数据库读取,否则从数据库再次读取
例如:
private static ObjectCache _cache = new MemoryCache("MemoryCache");
public List<Oils> GetDataFromCache(string keyName)
{
//private static ObjectCache _cache = new MemoryCache("keyName");
var data = _cache.Get(keyName);
if (data != null) return data as List<Oils>;
data = _context.Oils.ToList();
//keep the cache for 2h
_cache.Add(keyName, data, DateTimeOffset.Now.AddHours(2));
return data;
}
private static ObjectCache\u cache=newmemorycache(“MemoryCache”);
公共列表GetDataFromCache(字符串键名)
{
//私有静态ObjectCache_cache=newmemorycache(“keyName”);
var data=\u cache.Get(keyName);
如果(data!=null)返回数据列表;
数据=_context.Oils.ToList();
//将缓存保留2小时
_Add(keyName,data,DateTimeOffset.Now.AddHours(2));
返回数据;
}
(没有测试代码,但这是逻辑)或者,如果愿意,您可以使用会话
会话示例:
if(Session["Data_Oils"] != null) { return Session["Data_Oils"] as List<Oils; } else { var temp = _context.Oils.ToList(); Session["Data_Oils"] = temp; return temp; }
if(Session[“Data_Oils”!=null){return Session[“Data_Oils”]as list还可以使用缓存添加回调函数以在过期后填充缓存,在示例中,在2hc之后可以建议有关该会话的一些细节吗?并且您最终忘记返回数据。if(Session[“Data_Oils”!=null){return Session[“数据”]如清单所示请更新我已标记为答案的答案。