Так работает Entity Framework.
Если вам нужен больший контроль, вы можете написать запрос самостоятельно с помощью Entity Framework Raw Queries, см. здесь и ниже (не завершено)пример того, как может выглядеть ваш запрос.
DbRawSqlQuery<Int32> query = db.Database.SqlQuery<Int32>("SELECT OrderStatusId FROM ... ");
var statusId = query.FirstOrDefault();
Edit:
Также посмотрите на фактический план запроса, который выполняется для этого запроса вЧтобы определить, присутствуют ли соответствующие индексы в соответствующих таблицах.
Рассмотрите возможность перемещения констант RealAudit
и 80
в переменные, как показано ниже:
var orderType = "RealAudit";
var orderStatusId = 80;
var statusId = db.WorkOrder.Where(w => w.OrderType.Name == orderType
&& w.WorkOrderMapping.MeterOldTag == meterTag
&& w.OrderStatusId != orderStatusId
)
.OrderByDescending(w => w.CreationDatetime)
.Select(r => r.OrderStatusId)
.FirstOrDefault();
Делая такони будут отображаться как параметры SQL в запросе, что-то вроде:
@p__linq__1 <> [Extent1].[OrderStatusId])
AND (@p__linq__2 = [Extent2].[Name])
Это позволяет использовать один план запроса для всех вариантов этого запроса, тогда как теперь вы получаете план запроса для отдельного значенияаргумент MeterOldTag
.