提高使用ToList()的Linq查询性能
本文关键字:Linq 查询 性能 高使用 ToList | 更新日期: 2023-09-27 18:18:44
@Rahul Singh在这篇文章中写的代码将TSQL转换为Linq到实体:
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到fillist的导航属性。如果您使用DB First,并且在数据库中设置了外键约束,它应该自动为您执行此操作。
如果你提供你的表设计(或模型类),这也会有很大帮助。
最后,您可以使用.Any()
重写.ToList().Contains(...)
,这应该可以解决您的直接问题。比如:
_dbContext.FileLists.Count(f => x.Any(z => z.Extension==f.Extension)));