рассчитывать на союз LINQ - PullRequest
1 голос
/ 25 марта 2010

У меня есть такая ссылка:

List<UserGroup> domains = UserRepository.Instance.UserIsAdminOf(currentUser.User_ID);

query = (from doc in _db.Repository<Document>()
         join uug in _db.Repository<User_UserGroup>() on doc.DocumentFrom equals uug.User_ID
         where domains.Contains(uug.UserGroup)
         select doc)
.Union(from doc in _db.Repository<Document>()
       join uug in _db.Repository<User_UserGroup>() on doc.DocumentTo equals uug.User_ID
       where domains.Contains(uug.UserGroup)
       select doc);

Выполнение этого оператора не вызывает никаких проблем. Но когда я хочу посчитать набор результатов, запрос неожиданно запускается довольно медленно.

totalRecords = query.Count();

Результат этого запроса:

SELECT COUNT([t5].[DocumentID])
FROM (
    SELECT [t4].[DocumentID], [t4].[DocumentFrom], [t4].[DocumentTo]
    FROM (
        SELECT [t0].[DocumentID], [t0].[DocumentFrom], [t0].[DocumentTo
        FROM [dbo].[Document] AS [t0]
        INNER JOIN [dbo].[User_UserGroup] AS [t1] ON [t0].[DocumentFrom] = [t1].[User_ID]
        WHERE ([t1].[UserGroupID] = 2) OR ([t1].[UserGroupID] = 3) OR ([t1].[UserGroupID] = 6)
        UNION
        SELECT [t2].[DocumentID], [t2].[DocumentFrom], [t2].[DocumentTo]
        FROM [dbo].[Document] AS [t2]
        INNER JOIN [dbo].[User_UserGroup] AS [t3] ON [t2].[DocumentTo] = [t3].[User_ID]
        WHERE ([t3].[UserGroupID] = 2) OR ([t3].[UserGroupID] = 3) OR ([t3].[UserGroupID] = 6)
        ) AS [t4]
    ) AS [t5]

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

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 25 марта 2010

Убедитесь, что индексы [Document].[DocumentFrom], [Document].[DocumentTo] и [User_UserGroup].[UserGroupID].

.

Читая ваш запрос, я вижу, как вы присоединяетесь к одной и той же таблице при разных условиях.
Если вам не нужны повторяющиеся результаты , вы можете посмотреть на эту альтернативу:

var query = from doc in _db.Repository<Document>()
            from uug in _db.Repository<User_UserGroup>() 
            //join wether DocumentFrom or DocumentTo equals User_ID
            where (
                     (doc.DocumentFrom == uug.User_ID) ||
                     (doc.DocumentTo == uug.User_ID)
                  ) &&
                  //same check on this                      
                  domains.Contains(uug.UserGroup)
            select doc;

//execute it
var list = query.ToList();

РЕДАКТИРОВАТЬ : Если я не ошибаюсь .Union выбирает различные элементы между двумя запросами, поэтому мой альтернативный IS допустимый.
Если вы действительно хотите объединить два набора результатов, вы можете посмотреть на .Concat.

0 голосов
/ 25 марта 2010

Избавьтесь от своих союзов и попробуйте что-нибудь подобное.

query = (from doc in _db.Repository<Document>().Where(x=> _db.Repository<User_UserGroup>().Any(y=>y.User_ID==x.DocumentFrom ||y.User_ID==x.DocumentTo ))

Извините, я не могу гарантировать, что он скомпилируется ... но в основном использую где-нибудь еще, чтобы выполнить вашу работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...