视图花费太长时间渲染我的结果

本文关键字:我的 结果 长时间 视图 | 更新日期: 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,然后将它们合并到内存中,您可能会发现速度更快。