2009-11-14 64 views
0

我在我的asp.net網站有一個Linq To Sql查詢。Linq Query - 如何改進以下查詢?

此查詢也可以工作並確保它可以改進。

誰能幫幫我ReWrite this query?

我假設使用「連接」會使它更快,但不能正確的。 :(


下面是查詢:(輸入PARAMS:INT_GENDER)。

var users = from u in db.Users 
      where (u.gender == INT_GENDER) && (u.age > 25) 
      let fileId = (from f in db.Files 
         where f.username == u.username && f.approved 
         orderby f.primary 
         select f.id).FirstOrDefault() 
      let answer = (from a in db.Answers 
          where (a.username == u.username) && 
           (a.q_id == (from q in db.Questions where q.type == 1 
                select q.id).FirstOrDefault()) && 
            a.approved 

          select a).FirstOrDefault() 

select new { 

    Username = u.u_username, 
    FileId = fileId !=null ? fileId : GetEmptyFileId(), 
    Answer = (answer == null ? "" : (answer.approved ? answer.value: "Empty")) 
}; 

查詢是基於3個表 表: 1.用戶 2.文件 3.答案

  • 用戶表中的用戶名列是標識
  • 每個用戶可以有很多或沒有文件
  • 每個用戶可以有很多或沒有答案。

謝謝! Dan

+0

INT_GENDER ?? ??爲什麼不布爾如果你正在使用的是男性或女性。爲了獲得最佳性能,請使用存儲過程。這是因爲存儲過程緩存對於快速檢索非常有用的執行計劃。 – AboutDev 2009-11-14 22:17:15

+0

謝謝。 1. INT_GENDER可以是0,1,2。 2.我寧願留在linq中,我知道我也可以使它成爲一個完整的查詢,但我希望先寫一個更好的查詢。 – dan 2009-11-14 22:23:44

+0

@AboutDev準備好的查詢(如LINQ to SQL中使用的查詢)也將其執行計劃緩存起來。關於存儲過程的優越性的城市傳說正在變老。 – 2009-11-14 23:16:19

回答

0

這是我在普通的T-SQL中破解這個的適度嘗試。希望這可以幫助。

SELECT u.username, f.id, a.value, a.approved 
FROM users AS u 
    JOIN files AS f ON u.username = f.username 
    JOIN answers AS a ON a.username = u.username 
    JOIN questions AS q ON a.q_id = q.id  
WHERE u.gender = @INT_GENDER 
     AND u.age > 25 
     AND f.approved = 1 
     AND a.approved = 1 
     AND q.type = 1