查看需要很长时间才能呈现结果

时间:2015-07-29 05:22:42

标签: c# asp.net performance linq linq-to-sql

我有一个控制器,它基本上通过返回View(result);

返回一个IOrderedQueriable对象

关键是,当视图尝试执行该查询时,它需要花费大量时间,并且最终会出现一些超时异常。我相信原因是因为在结果下创建的查询非常复杂。我想知道我是否可以就如何改进我的linq查询提出一些建议。

这是我丑陋而讨厌的疑问:

Options -Multiviews
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^bonus/(.*)$ /bonus.php?query=%1

上面的代码执行得非常快,我想这是因为它只是生成查询本身。但是当它进入视图并尝试迭代到结果时,它需要很长时间才能到达foreach循环。

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);                    
}

关于如何优化它的任何想法?最后,我的查询返回大约100个File对象。但是对象内每个属性的初始化正在杀死系统......

谢谢!

1 个答案:

答案 0 :(得分:0)

使用Sql Profiler查看实际执行的SQL命令。我怀疑你可能会看到每个返回结果的多个查询(即这可能会为你的100个结果发出超过200个SQL命令)。

如果您分别检索TotalTags和UnprocessedTags然后将它们合并到内存中,您可能会发现它更快。