【发布时间】:2017-03-01 21:48:43
【问题描述】:
我在优化此查询时遇到了一些问题。
这是为了过滤掉具有特定技能的用户。
这些技能以 ID 列表的形式发送到服务器,这些 ID 是 GUID。
不幸的是,我不能像我希望的那样简单地获取用户,因为最后一个处理此问题的人将它放在 SQL 视图中。
我们在这里尝试找到所有选择了所有技能的用户。
skillIDs 是 GUID 列表
这是它的样子
myview.Where(view => skillIDs.All(skill => view.User.Skills.Any(s => s.ID == skill)))
我们尝试过的其他事情
myView.Where(view => !skillIDs.Except(view.User.Skills.Select(skill => skill.ID).Any()))
myview.Where(view => skillIDs.All(skill => view.User.Skills.Select(s => s.ID).contains(skill)))
我意识到它的工作方式非常低效,是的,我们正在对结果进行分页,但直到此查询之后。我相信正在发生的是它在这里执行查询,而不是等待应该执行的.skip(0).Take(10).tolist()。现在它需要 45 秒才能工作。当它不尝试执行上面的查询时不到一秒,所以我知道这是罪魁祸首。
【问题讨论】:
-
你的列有索引吗?
-
我有,但是你不能真正在sql视图上做索引
-
为什么视图上没有索引?
-
但是您试图让所有拥有一套技能的用户都正确吗?
-
skillIDs通常包含多少个元素?
标签: c# sql-server linq views