У меня следующий запрос, который вызывает у меня проблемы с производительностью на сервере 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;
}