【发布时间】: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<Tags>,我使用 '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