Я использую LINQ to SQL для извлечения данных с использованием булевых условий (столбцы BIT в SQL). Мой LINQ запрос выглядит примерно так:LINQ to SQL генерирует отрицательные условия в выражении WHERE
var query = from r in db.Requests
select r;
query = query.Where(r => r.Completed == someBooleanVal);
query = query.Where(r => r.Cancelled == someOtherBool);
return query.ToList();
'где() будет применяться в другом методе, поэтому я ставлю его в отдельности.
Когда булевы значения приведены как ложные, сгенерированный SQL выглядит примерно так:
SELECT [t0].[col1], [t0].[col2], [t0].[col3], [t0].[etc]
FROM [dbo].[Requests] AS [t0]
WHERE (NOT(([t0].[Cancelled]) = 1) AND (NOT(([t0].[Completed]) = 1)
вместо того, что я хотел бы использовать:
WHERE [t0].[Cancelled] = 0 AND [t0].[Completed] = 0
Это работает очень, очень медленно. Я сильно подозреваю, что это из-за отрицательных условий на построенных им булевых значениях (все выбранные столбцы покрываются индексом, а два столбца в предложении where имеют на них отдельный индекс).
Почему это создает отрицательные условия? Как я могу это исправить?
Вы пытались выполнить «очищенный» (т. Е. Неотрицательный) SQL, чтобы увидеть, как это выполняется по сравнению с созданным Linq SQL? –
Являются ли битовые поля нулевыми? – leppie
Я пробовал это с неотрицательными условиями. В тесте, которое я сделал: с неотрицательными условиями запрос занимает менее секунды. Сгенерированный запрос занимает более 3 секунд. – avesse