LINQ优化,用于查找对象是否存在于列表中的列表中

本文关键字:列表 于列表 存在 优化 用于 查找 是否 对象 LINQ | 更新日期: 2023-09-27 18:09:51

目前我有7000个视频条目,我很难优化它来搜索标签和演员。

这是我的代码,我试图修改,我尝试使用哈希集。这是我第一次使用它,但我觉得我做得不对。

        Dictionary dictTag = JsonPairtoDictionary(tagsId,tagsName);
        Dictionary dictActresss = JsonPairtoDictionary(actressId, actressName);
        var listVid =  new List<VideoItem>(db.VideoItems.ToList());
        HashSet<VideoItem> lll = new HashSet<VideoItem>(listVid);
        foreach (var tags in dictTag)
        {
            lll = new HashSet<VideoItem>(lll.Where(q => q.Tags.Exists(p => p.Id == tags.Key))); 
        }
        foreach (var actress in dictActresss)
        {
            listVid = listVid.Where(q => q.Actress.Exists(p => p.Id == actress.Key)).ToList(); 
        }

第一部分,我通过使用db.VideoItems.ToList()

获得Db中的所有视频

然后循环检查标签是否存在

对于每个VideoItem,它有一个List<Tags>,我使用'exist'来检查标签是否匹配。

女星也是如此。

我不确定是否因为我在调试模式和ApplicationInsight是活跃的,但它很慢。我将得到像baseType:RemoteDependencyData每秒10-15个事件,我不确定这是否意味着它仍然连接到数据库(不应该,因为我只应该只与所有视频的新列表混淆)或什么。

7分钟后,它仍在处理,这是我等待的最长时间。

我不敢把它放在我的网站上,因为它会像糖果一样吞噬我的资源

LINQ优化,用于查找对象是否存在于列表中的列表中

与其优化linq,不如优化数据库查询。数据库在优化搜索和创建子集方面非常出色,并且很可能比您编写的任何内容都要快。如果您需要基于多个数据库参数创建一个子集,我建议您考虑创建一些索引并使用它们。

编辑:

消除first for循环的db查询示例(实际上是多个嵌套循环和时间延迟的来源):

select * from videos where tag in [list of tags]

Edit2

为了确保这是最有效的,需要数据库在TAGS列上建立索引。创建索引:

CREATE INDEX video_tags_idx ON videos (tag)

使用' explained '查看索引是否被自动使用(应该是)

explain select * from videos where tag in [list of tags]

如果它没有显示你的索引被使用,你可以查找语法来强制使用它

问题不是优化,而是Microsoft SQL或我的ApplicationDbContext的利用率。

当我意识到http://www.albahari.com/nutshell/predicatebuilder.aspx

因为关键字搜索的问题,可以有多个关键字,我上面写的代码没有使用SQL,这使得执行时间很长。

使用谓词构建器,可以在LINQ
中创建动态条件。