2012-07-22 51 views
0

我有一個C#項目Linq查詢中的where子句的重要位置嗎?

 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此LINQ查詢,就像

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

將使其對查詢的性能有什麼區別?

+0

這是Linq-to-SQL,對吧? – 2012-07-22 17:21:11

+1

這將取決於查詢提供程序。這肯定會影響到LINQ to Objects,因爲如果您稍後在查詢中進行了篩選,您可能會加入的項數可能更少。 – 2012-07-22 17:24:09

+0

@MareInfinitus我正在使用sql-server 2008數據庫,所以它的Linq-to-SQL我猜... – Nalaka526 2012-07-22 17:28:24

回答

1

我不確定它會工作,如果你這樣做,但如果你使用它對SQL數據庫它應該沒有任何區別。這兩個查詢將被轉換爲這樣一個SQL:

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

即使它移動時它也能正常工作......無論如何感謝您的答案.. :) – Nalaka526 2012-07-22 17:32:15

1

至於性能,我強烈建議把 任何地方前加入。

的原因是,該加入已經使較小的一組 (在p從帖子加以選擇,並採取那麼只有 從作者的匹配行和用戶。

在相反的,如果你有一個地方附近開始 一個caresian(大)產品進行計算,然後過濾。 (在特殊情況下,只有一張桌子受到影響,但 查詢可有時改變,就再也沒有人知道 爲什麼它是慢)。

請閱讀SO Why is LINQ join so much faster than LINQ where

更多關於您的特例:因爲這會影響數據庫,所以在兩個查詢中產生的SQL語句都應該是相同的。 看看吧!