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()
然后循环检查标签是否存在
对于每个VideoItem,它有一个List<Tags>
,我使用'exist'来检查标签是否匹配。
女星也是如此。
我不确定是否因为我在调试模式和ApplicationInsight是活跃的,但它很慢。我将得到像baseType:RemoteDependencyData
每秒10-15个事件,我不确定这是否意味着它仍然连接到数据库(不应该,因为我只应该只与所有视频的新列表混淆)或什么。
7分钟后,它仍在处理,这是我等待的最长时间。
我不敢把它放在我的网站上,因为它会像糖果一样吞噬我的资源
与其优化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