我有一个控制器,它基本上通过返回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对象。但是对象内每个属性的初始化正在杀死系统......
谢谢!
答案 0 :(得分:0)
使用Sql Profiler查看实际执行的SQL命令。我怀疑你可能会看到每个返回结果的多个查询(即这可能会为你的100个结果发出超过200个SQL命令)。
如果您分别检索TotalTags和UnprocessedTags然后将它们合并到内存中,您可能会发现它更快。