[英]Improve Linq query performance that use ToList()
@Rahul Singh在这篇文章中编写的这段代码将TSQL转换为Linq to Entities :
var result = _dbContext.ExtensionsCategories.ToList().GroupBy(x => x.Category)
.Select(x =>
{
var files = _dbContext.FileLists.Count(f => x.Select(z => z.Extension).Contains(f.Extension));
return new
{
Category = x.Key,
TotalFileCount = files
};
});
但是此代码在数据库上下文中使用时有问题,我们应该使用ToList()这样来修复“在此上下文中仅支持原始类型或枚举类型”错误:
var files = _dbContext.FileLists.Count(f => x.Select(z => z.Extension).ToList().Contains(f.Extension));
问题是ToList()获取所有记录并降低性能,现在我编写了自己的代码:
var categoriesByExtensionFileCount =
_dbContext.ExtensionsCategories.Select(
ec =>
new
{
Category = ec.Category,
TotalSize = _dbContext.FileLists.Count(w => w.Extension == ec.Extension)
});
var categoriesTOtalFileCount =
categoriesByExtensionFileCount.Select(
se =>
new
{
se.Category,
TotalCount =
categoriesByExtensionFileCount.Where(w => w.Category == se.Category).Sum(su => su.TotalSize)
}).GroupBy(x => x.Category).Select(y => y.FirstOrDefault());
这段代码的性能更好,但是它包含很多代码行,有关提高第一个代码的性能或减少第二个代码的行的任何想法:D
此致Mojtaba
您应该具有从ExtensionCategories到FileLists的导航属性。 如果您使用的是DB First,并且在数据库中设置了外键约束,则它应该为您自动执行此操作。
如果您提供表设计(或模型类),那么也会有很大帮助。
最后,你可以重写使用.ToList().Contains(...)
用.Any()
应该解决您的眼前问题。 就像是:
_dbContext.FileLists.Count(f => x.Any(z => z.Extension==f.Extension)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.