Linq к сущности, добавление предложения Where () прерывает запрос - PullRequest
0 голосов
/ 07 февраля 2019

Использование Microsoft SQL Entity Framework У меня есть запрос, где иногда у меня есть условие фильтра, а иногда нет, поэтому я попытался сделать то, что я показал ниже.Если условие не равно нулю, то вместо выполнения запроса, как ожидалось, оно запрашивает все из таблицы Org_Hierarchy, а затем запрашивает все из таблицы Workers, а затем умирает, поскольку это занимает слишком много времени:

void SomeMethod(Func<PRT, bool> whereClause) {
    IQueryable<PRT> query;
    if (whereClause != null) {
        query = PRT.Where(whereClause).AsQueryable();
    } else {
        query = PRT.AsQueryable();
    }

    var data = from prt in query
               // LEFT OUTER JOIN Worker a ON prt.assigned_to = a.WWID
           join a_join in Worker on prt.assigned_to equals a_join.WWID into a_grp
           from a in a_grp.DefaultIfEmpty()
               // LEFT OUTER JOIN Worker c ON prt.closed_by = c.WWID
           join c_join in Worker on prt.closed_by equals c_join.WWID into c_grp
           from c in c_grp.DefaultIfEmpty()
               // LEFT OUTER JOIN Worker r ON prt.requestor = r.WWID
           join r_join in Worker on prt.requestor equals r_join.WWID into r_grp
           from r in r_grp.DefaultIfEmpty()
               // LEFT OUTER JOIN Org_Hierarchy o ON prt.org3 = o.OrganizationHierarchyUnitCd AND o.OrganizationHierarchyUnitTreeLevelNbr = 3 AND o.Active = true
           join o in Org_Hierarchy on prt.org3 equals o.OrganizationHierarchyUnitCd
           select new PrtInput {

Если я изменю запрос и добавлю туда что-то прямое, просто для тестирования, например where prt.id == Guid.NewGuid() прямо над последней показанной строкой, запрос вернется через одну секунду.В чем хитрость, позволяющая динамически добавлять предложение where в запрос?

Приведенный выше код взят из LinqPAD, поэтому все обычные «контекстные» элементы отсутствуют.

1 Ответ

0 голосов
/ 08 февраля 2019

Я не уверен, но я думаю, что вы должны использовать что-то вроде этого:

Expression<Func<PRT ,bool>> whereClause

Insted of:

Func<PRT ,bool> whereClause

Когда вы используете Func <>, сначала получите данныеиз базы данных в память, затем фильтруйте данные в памяти, но если вы используете фильтр Epression <>, отправьте в sql и верните результат.

Также для лучшей производительности вы можете использовать AsNoTracking (), например:

if (whereClause != null) {
    query = PRT.Where(whereClause).AsQueryable().AsNoTracking();
} else {
    query = PRT.AsQueryable().AsNoTracking();
} 

Если вы хотите, чтобы запрос выполнялся только в вашей базе данных без вставки, обновления или удаления результата, лучше использовать AsNoTracking.

Я надеюсь, что это ответ на ваш вопрос.

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