2011-05-25 62 views
1

我很難提出一個高效的LINQ-to-SQL查詢。我試圖做這樣的事情:爲什麼這個額外的連接會增加查詢的數量?

from x in Items 
select new 
{ 
    Name = x.Name 
    TypeARelated = from r in x.Related 
        where r.Type == "A" 
        select r 
} 

正如你所期望的,它會產生一個單一的查詢從「項目」表,其中的左連接上的「相關」表。現在,如果我再添幾個類似的行...

from x in Items 
select new 
{ 
    Name = x.Name 
    TypeARelated = from r in x.Related 
        where r.Type == "A" 
        select r, 
    TypeBRelated = from r in x.Related 
        where r.Type == "B" 
        select r 
} 

其結果是,在第一次嘗試類似的查詢運行,其次是個人查詢「相關」表中的每個記錄在「項目」 。有沒有辦法將這一切都包裝在一個查詢中?這會是什麼原因?預先感謝您提供的任何幫助。

回答

3

如果直接在SQL編寫上面的查詢將被寫成像這樣(僞代碼):

SELECT 
    X.NAME AS NAME, 
    (CASE R.TYPE WHEN A THEN R ELSE NULL) AS TypeARelated, 
    (CASE R.TYPE WHEN B THEN R ELSE NULL) AS TypeBRelated 
FROM Items AS X 
JOIN Related AS R ON <some field> 

然而,LINQ到SQL是效率不高,從你的解釋,但它確實一個加盟,然後去單獨比較每條記錄。更好的方法是使用兩個類似於第一個示例的linq查詢,這會生成兩個SQL查詢。然後使用兩個linq查詢的結果並加入它們,這將不會生成任何SQL語句。此方法會將在SQL中執行的查詢數量限制爲2.

如果條件數ierType ==「A」等隨着時間的推移會增加,或者要添加不同的條件,那麼您最好使用存儲過程,這將是一個SQL查詢在任何時候。

Hasanain

1

您可以使用預先加載做服務器上的一個連接,看看是否有幫助。試試這個。

using (MyDataContext context = new MyDataContext()) 
{ 
    DataLoadOptions options = new DataLoadOptions(); 
    options.LoadWith<Item>(i => i.Related); 
    context.LoadOptions = options; 

    // Do your query now. 
} 
相關問題