2009-11-14 2 views
0

У меня есть запрос Linq To Sql на моем сайте asp.net.Linq Query - как вы можете улучшить следующий запрос?

Этот запрос также работает Slow и убедитесь, что его можно улучшить.

Может ли кто-нибудь помочь мне переписать этот запрос?

Я предполагаю, что использование «соединения» сделает его быстрее, но не может понять это правильно. :(


Вот запрос: (входные Титулы: 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 ?? Почему бы не bool, если все, что вы используете, это мужчина или женщина. Также для лучшей производительности используйте хранимую процедуру proc. Это связано с тем, что хранимые процедуры кэшируют план выполнения, что очень полезно для быстрого извлечения. – AboutDev

+0

спасибо. 1. INT_GENDER может быть 0,1,2. 2. Я предпочитаю оставаться с linq, я знаю, что могу также сделать его выполненным, но я хотел сначала написать лучший запрос. – dan

+0

@AboutDev Подготовленные запросы (например, используемые в LINQ to SQL) также имеют кеш-план выполнения. Городская легенда об этом превосходстве хранимых проков стареет. –

ответ

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 
Смежные вопросы