如何优化这个linq查询?
我有以下linq查询:
var allnews = from a in db.News
where !(from c in db.NewsViews
where c.UserGuid == thisUser.UserGuid
select c.NewsGuid).Contains(a.NewsGuid)
orderby a.Date descending
select a;
我想知道优化它的最佳方法是什么?或者查询分析器会为我做那个吗?
编辑:想法是获取用户尚未看到的所有新闻项目。因此,一旦用户看到一个项目,我就将该项目存储在NewsViews中。新闻本身就在新闻中。
没有找到相关结果
已邀请:
6 个回复
蓄荣糖些
,所以
但是请注意,您现在正在通过LINQ进行SQL优化(顺便说一句,这是L2S还是EF?)。 而正常的SQL优化很难。您必须使用实际数据进行测量和分析。 @ Joachim的多内连接子查询方法很可能更好。
荒劫娇噬
骂狮淋唐便
当然,这假设您已经在模型中在News和NewsViews实体之间建立了关联。通过提前设置关联,子查询变得不必要。 更新: 我已经使用LINQ-to-SQL大约18个月了,而且我一直在使用与你为我的
查询所示的结构相同的结构。正如我之前所说的,如果你提前在模型中设置关联并使用数据库本身的索引,你可能会遇到一点性能提升,但从LINQ的角度来看,我相信你已经像你一样优化了。在不诉诸不必要的神秘查询语句的情况下重新开始。
席酱
但至于这是否更快 - 这是任何人的猜测;试试吧。从根本上说,你正在进行左连接,左边的部分被过滤掉了,不能返回任何结果 - 那些索引不好,AFAIK。执行引擎需要扫描新闻集中的所有行,如果您受SQL支持,则表扫描不是您的朋友。话虽如此,除非你真的希望这是一个巨大的桌子,它可能并不重要,特别是如果你只报告前N个命中...
断跑胺弄萎
乏摩纶誊伟
当您尝试执行列表不包含其他列表的查询时,Except将生成性能最佳的SQL。由于没有从NewsView导航到新闻,我们不得不欺骗内部加入返回新闻。 可以做到的另一种方式是我的朋友GroupJoin。
这就是我至少要做到的。