Я использую LINQ to SQL для извлечения данных, используя логические условия (столбцы BIT в SQL). Мой запрос LINQ выглядит примерно так:
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();
'Where ()' применяется другим способом, поэтому я добавляю его отдельно.
Когда логические значения заданы как ложные, сгенерированный 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 имеют отдельный индекс).
Почему это порождает негативные условия? Как я могу это исправить?