视图花费太长时间渲染我的结果
本文关键字:我的 结果 长时间 视图 | 更新日期: 2023-09-27 18:05:28
我有一个控制器它通过return View(result);返回一个iorderedquerable对象
关键是,当视图试图执行该查询时,它需要花费很多时间,并且最终会出现一些超时异常。我相信原因是因为在result下创建的查询非常复杂。我想知道我是否能得到一些关于如何改进我的linq查询的建议。
这是我的丑陋和讨厌的查询:
public ActionResult FileList(string productName, string projectName)
{
var tagCount = (from l in db.FileDatas
from t in db.ProcessedFiles.Where(x => l.FileId == x.FileId &&
l.ProductId == x.ProductId &&
l.ProjectId == x.ProjectId &&
l.Product.Product1.Equals(productName))
.GroupBy(t => new { .ProductId, t.ProjectId, t.FileId, l.ExtensionId })
select new GroupedTagsRow
{
ProductName = l.Product.Product1,
ProjectName = l.Project.Project1,
FileName = l.File.File1,
Occurrences = t.Sum(x => x.Occurrences)
});
var unprocessedTags = db.UnProcessedTags
.Where(x => x.Product.Product1.Equals(productName) &&
x.Project.Project1.Equals(projectName) &&
x.TagId != 1);
var listOfFiles = db.FileDatas
.Where(x => x.Product.Product1.Equals(productName) &&
x.Project.Project1.Equals(projectName));
var result = listOfFiles
.GroupBy(file => file.File)
.Select(data => new File
{
FileName = data.FirstOrDefault().File.File1,
TotalTags = tagCount.Where(p => p.FileName.Equals(data.FirstOrDefault().File.File1)).Sum(x => x.Occurrences).ToString(),
UnprocessedTags = unprocessedTags.Where(p => p.File.File1.Equals(data.FirstOrDefault().File.File1)).DefaultIfEmpty().Count().ToString(),
})
.OrderBy(fileName => fileName.FileName);
return View(result);
}
上面的代码执行得非常快,我猜这是因为它只是生成查询本身。但当它进入视图并尝试迭代到结果时,它需要很长时间才能到达foreach循环。
@model IQueryable<File>
@{
ViewBag.Title = "File";
}
<h4>Number of files: <strong> @Model.Count() </strong></h4>
@foreach (var item in Model)
{
@RenderItem(item);
}
你知道我该如何优化它吗?最后,我的查询返回大约100个File对象。但是对象内的每个属性的初始化会杀死系统…
谢谢!
使用Sql Profiler查看实际正在执行的Sql命令。我怀疑您可能会看到每个返回结果的多个查询(例如,这可能会为您的100个结果发出200多个SQL命令)。
如果您分别检索TotalTags和UnprocessedTags,然后将它们合并到内存中,您可能会发现速度更快。