【发布时间】:2016-02-15 08:53:30
【问题描述】:
我正在开发监控应用程序。例如,打印机,记录在用户配置文件中。目标是获取每台打印机的用户列表。管理员可能必须按用户、PC、默认打印机...过滤结果...并以 CSV 格式导出结果。因此,当管理员进行导出时,csv 需要与活动过滤器相关联。我尝试使用 EF 6 创建一个静态缓存,以保留这些过滤器。
缓存类
public class PrintersCache
{
public static AuditprinterDBEntities1 db = new AuditprinterDBEntities1();
public static IQueryable<AuditPrinter> auditPrinterCache = null;
public static IQueryable<AuditPrinter> AuditPrinterCache
{
get
{
if (auditPrinterCache == null) auditPrinterCache = db.AuditPrinter.Include(a => a.Pc).Include(a => a.PrintersConfig).Include(a => a.Users);
return auditPrinterCache;
}
}
}
在控制器中,我正在调用我的类
static IQueryable<AuditPrinter> auditPrinter = PrintersCache.AuditPrinterCache;
然后,在过滤方法的开头:
auditPrinter = PrintersCache.AuditPrinterCache;
以及导出方式:
public void ExportCSV()
{
var sw = new StringWriter();
sw.WriteLine(String.Format("{0};{1};{2};{3}", "PcName", "Date", "ActivityName", "UserName"));
foreach (var record in auditPrinter)
{
sw.WriteLine(String.Format("{0};{1};{2};{3}", record.Pc.PcName, record.Date, record.Activity.ActivityName, record.Users.UserName));
}
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=Export.csv");
Response.ContentType = "text/csv";
Response.Write(sw);
Response.End();
}
它正在工作......但搜索速度有点慢,例如,如果我很快点击搜索按钮 5 或 6 次,我会得到一个 'System.Data.Entity.Core.EntityException' 。 The underlying provider failed on Open.我需要二级缓存吗?
编辑:搜索过滤方法
public ActionResult LaunchSearch(string keyword, string keyword2, int chx, int pid, int fid)
{
auditPrinter = PrintersCache.AuditPrinterCache;
string returnpartial = "";
switch (chx)
{
case 1:
if(pid!=0)
{
auditPrinter = auditPrinter.Where(a => a.Printers.PrinterId == pid);
}
returnpartial = "Indexprinter";
break;
case 2:
if (pid != 0)
{
auditPrinter = auditPrinter.Where(a => a.UserId == pid);
} else
{
auditPrinter = auditPrinter.OrderBy(a => a.Users.UserName).ThenBy(a => a.Pc.PcName);
}
returnpartial = "Indexvuser";
break;
case 3:
if (pid != 0)
{
auditPrinter = auditPrinter.Where(a => a.Pc.PcId == pid);
}
else
{
auditPrinter = auditPrinter.OrderBy(a => a.Pc.PcName).ThenBy(a => a.Users.UserName);
}
returnpartial = "Indexvpc";
break;
}
if (keyword != "")
{
switch (chx)
{
case 1:
auditPrinter = auditPrinter.Where(a => a.Users.UserName.Contains(keyword)).OrderBy(a => a.Users.UserName).ThenBy(a => a.Pc.PcName);
break;
case 2:
auditPrinter = auditPrinter.Where(a => a.Users.UserName.Contains(keyword)).OrderBy(a => a.Users.UserName).ThenBy(a => a.Pc.PcName);
break;
case 3:
auditPrinter = auditPrinter.Where(a => a.Pc.PcName.Contains(keyword)).OrderBy(a => a.Pc.PcName).ThenBy(a => a.Users.UserName);
break;
}
}
if (keyword2 != "")
{
switch (chx)
{
case 1:
auditPrinter = auditPrinter.Where(a => a.Users.UserName.Contains(keyword) && a.Pc.PcName.Contains(keyword2)).OrderBy(a => a.Pc.PcName).ThenBy(a => a.Users.UserName);
break;
case 2:
auditPrinter = auditPrinter.Where(a => a.Users.UserName.Contains(keyword) && a.Pc.PcName.Contains(keyword2)).OrderBy(a => a.Pc.PcName).ThenBy(a => a.Users.UserName);
break;
case 3:
auditPrinter = auditPrinter.Where(a => a.Pc.PcName.Contains(keyword) && a.Users.UserName.Contains(keyword2)).OrderBy(a => a.Users.UserName).ThenBy(a => a.Pc.PcName);
break;
}
}
if (fid != 0)
{
switch (fid)
{
case 1:
auditPrinter = auditPrinter.Where(a => a.PrintersConfig.IsDefault == true);
break;
case 2:
auditPrinter = auditPrinter.Where(a => a.PrintersConfig.IsDefault == false);
break;
}
}
return PartialView(returnpartial, auditPrinter.ToList());
}
【问题讨论】:
标签: c# entity-framework caching static-methods