目前我有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<Tags>
,我使用'exists'来检查标记是否匹配。
然后与女演员一样。
我不确定它是否因为我处于调试模式而且ApplicationInsight处于活动状态但速度很慢。我将使用baseType:RemoteDependencyData
获得每秒10-15个事件,我不确定它是否意味着它仍然连接到数据库(不应该因为我只应该弄乱所有视频的新列表)或者是什么。
7分钟后它仍在处理,这是我等待的最长时间。
我害怕把它放在我的直播网站上,因为这会耗尽我的资源,如糖果
答案 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中创建动态条件