структура сущности, порядок путем предотвращения левого внешнего соединения - PullRequest
0 голосов
/ 27 апреля 2018

У меня следующий запрос, который вызывает у меня проблемы с производительностью на сервере SQL.

ctx.Articles
    .Where(m => m.Active)
    .Where(m => m.PublishDate <= DateTime.Now)
    .Where(m => m.Sponsored == false)
    .WhereIf(request.ExcludeFirstNews, m => m.PositionForCategory != 1)
    .WhereIf(category != null, m => m.RootCategoryId == category.RootCategoryId)
    .WhereIf(request.TimeRange != 0 && request.TimeRange == TimeRange.today, m => m.PublishDate.Value >= today)
    .WhereIf(request.TimeRange != 0 && request.TimeRange == TimeRange.yesterday, m => m.PublishDate.Value >= yesterday)
    .WhereIf(request.TimeRange != 0 && request.TimeRange == TimeRange.week, m => m.PublishDate.Value >= week &&
                                                       m.PublishDate.Value <= DateTime.Now)
    .WhereIf(request.TimeRange != 0 && request.TimeRange == TimeRange.month, m => m.PublishDate.Value >= month &&
                                                        m.PublishDate.Value <= DateTime.Now)
    .OrderByDescending(m => m.ArticleViewCountSum.ViewCountSum)

Есть ли способ заставить структуру сущностей использовать внутреннее соединение вместо левого внешнего соединения для упорядочения по синтаксической части лямбда-выражения? Я проверил запрос в профилировщике, и он генерирует левое внешнее соединение, которое в этом случае не требуется, и выполняется намного быстрее, если я изменяю запрос вручную в SQL.

EDIT: По вопросам, в комментариях это код для WhereIf

public static IQueryable<T> WhereIf<T>(
            this IQueryable<T> source,
            bool condition,
            Expression<Func<T, bool>> predicate)
        {
            if (condition)
            {
                return source.Where(predicate);
            }

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