LINQ优化用于搜索列表中列表中是否存在对象

时间:2016-10-02 20:09:37

标签: c# linq collections

目前我有7,000个视频条目,我很难对其进行优化以搜索标签和女演员。

这是我试图修改的代码,我尝试使用HashSet。这是我第一次使用它,但我不认为我做得对。

        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>,我使用'exists'来检查标记是否匹配。

然后与女演员一样。

我不确定它是否因为我处于调试模式而且ApplicationInsight处于活动状态但速度很慢。我将使用baseType:RemoteDependencyData获得每秒10-15个事件,我不确定它是否意味着它仍然连接到数据库(不应该因为我只应该弄乱所有视频的新列表)或者是什么。

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

我害怕把它放在我的直播网站上,因为这会耗尽我的资源,如糖果

2 个答案:

答案 0 :(得分:0)

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

修改

将首先消除for循环的db查询示例(实际上是多个嵌套循环以及时间延迟来自的地方):

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

<强> EDIT2

要确保这是最有效的,请要求数据库在TAGS列上编制索引。要创建索引:

CREATE INDEX video_tags_idx ON videos (tag)

使用&#39;解释&#39;查看索引是否自动使用(应该是)

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

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

答案 1 :(得分:0)

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

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

时,我发现了这一点

由于关键字搜索的问题,可能存在多个关键字,而我上面创建的代码没有使用占用执行时间长的SQL。

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