Linq Query - как вы можете улучшить следующий запрос? - PullRequest
0 голосов
/ 15 ноября 2009

У меня есть запрос Linq To Sql на моем сайте asp.net.

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

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

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


Вот запрос: (входные параметры: 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

1 Ответ

0 голосов
/ 15 ноября 2009

Вот моя скромная попытка расшифровать это простым 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...