【问题标题】:LINQ Optimization for searching a if an object exist in a list within a list用于搜索对象是否存在于列表中的列表中的 LINQ 优化
【发布时间】:2016-10-02 20:09:36
【问题描述】:

目前我有 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()获取数据库中的所有视频

然后它会通过一个循环来检查一个标签是否存在

对于每个 VideoItem,它都有一个 List&lt;Tags&gt;,我使用 'exist' 来检查标签是否匹配。

女演员也是如此。

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

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

我不敢把它放在我的现场,因为这会像糖果一样消耗我的资源

【问题讨论】:

  • 需要匹配所有标签还是任意标签?
  • 您从哪种数据库中提取? db.VideoItems 的类型是什么?我绝对不会通过 ToList() 提取所有视频,然后使用 LINQ 进行过滤 - 我会使用 LINQ 构建智能查询,使用在数据库中索引的项目,然后仅在需要时使用 LINQ to Objects您的数据提供商无法做到的非常高级的过滤。
  • 我试过 'db.VideoItems.Where(q=> q.Tags.Exists(p=>p.Id == 90));' #90 只是我正在测试的一个示例标签。而且速度要快得多,我认为我的问题是将搜索负载放在服务器而不是数据库中。现在我的问题是如何迭代该过程(我的代码中的 for 循环),因为我可能期望 2 或 3 个标签也是女演员代码。

标签: c# linq collections


【解决方案1】:

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

编辑:

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

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

编辑2

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

CREATE INDEX video_tags_idx ON videos (tag)

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

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

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

【讨论】:

  • 我该怎么做?你能举出在我的场景中考虑的例子吗?
  • Contains
  • 你能告诉我你为什么要使用 Contains 而不是 IN 的理由吗?
  • 我认为 contains 会找到相同的对象,但在这种情况下不确定。谢谢BoldAsLove。如果它会减少执行时间会尝试一下
  • Linq 查询 Contains 转换为 SQL 中的 IN(如果针对数据库运行)。
【解决方案2】:

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

当我意识到http://www.albahari.com/nutshell/predicatebuilder.aspx时我发现了这个

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多