0

我在 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
                    {
                        ...
                    };

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

4

2 回答 2

1

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

SELECT ...
FROM Posts INNER JOIN Author ON ... INNER JOIN Users ON ...
WHERE Posts.IsActive = true
...
于 2012-07-22T17:20:02.927 回答
1

关于性能,我强烈建议将连接放在任何位置之前。

原因是,连接已经形成了一个较小的集合(p 是从 Posts 中选择的,然后只采用来自 Author 和 Users 的匹配行。

相反,如果您在开始附近有一个 where ,则会计算一个 caresian(大)产品,然后对其进行过滤。(在您的特殊情况下,只有一个表受到影响,但查询可能会在某个时候改变,没有人知道为什么它很慢)。

请阅读此 SO为什么 LINQ 加入比 LINQ 快得多 where

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

于 2012-07-22T19:27:44.490 回答