提高使用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

提高使用ToList()的Linq查询性能

你应该有一个从ExtensionCategories到fillist的导航属性。如果您使用DB First,并且在数据库中设置了外键约束,它应该自动为您执行此操作。

如果你提供你的表设计(或模型类),这也会有很大帮助。

最后,您可以使用.Any()重写.ToList().Contains(...),这应该可以解决您的直接问题。比如:

_dbContext.FileLists.Count(f => x.Any(z => z.Extension==f.Extension)));