Where子句的位置在Linq查询中是否重要?

时间:2012-07-22 17:15:39

标签: linq linq-to-sql

我在C#项目中有这个linq查询

       var query = from p in db.Posts
                    join a in db.Author on p.Author equals a
                    join u in db.Users on p.PostedBy equals u
                    where p.IsActive.Equals(true)
                    orderby p.PostedDate descending
                    select new ViewModel
                    {
                        ...
                    };

如果我将where p.IsActive.Equals(true)移到from p in db.Posts附近,例如

       var query = from p in db.Posts
                    where p.IsActive.Equals(true) //Moved
                    join a in db.Author on p.Author equals a
                    join u in db.Users on p.PostedBy equals u
                    orderby p.PostedDate descending
                    select new ViewModel
                    {
                        ...
                    };

它会对查询的性能产生任何影响吗?

2 个答案:

答案 0 :(得分:1)

我不确定如果你这样做它会起作用,但如果你在SQL数据库中使用它,它应该没有任何区别。两个查询都将被翻译为SQL,如下所示:

SELECT ...
FROM Posts INNER JOIN Author ON ... INNER JOIN Users ON ...
WHERE Posts.IsActive = true
...

答案 1 :(得分:1)

关于表现,我强烈建议放 在任何地方之前加入。

原因是,连接已经变小了 (p从帖子中选择,然后才选择 来自作者和用户的匹配行。

相反,如果你有一个接近开头的地方 计算一个caresian(大)产品,然后过滤。 (在您的特殊情况下,只有一个表受到影响,但是 查询可能会在某个时候被更改,然后没有人知道 为什么它很慢。)

请阅读此SO Why is LINQ join so much faster than LINQ where

更多关于您的特殊情况:因为这会影响数据库, 两个查询中生成的SQL语句应该相同。 看看它!