繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM