2010-09-08 2 views
1

Я использую 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 имеют на них отдельный индекс).

Почему это создает отрицательные условия? Как я могу это исправить?

+0

Вы пытались выполнить «очищенный» (т. Е. Неотрицательный) SQL, чтобы увидеть, как это выполняется по сравнению с созданным Linq SQL? –

+0

Являются ли битовые поля нулевыми? – leppie

+0

Я пробовал это с неотрицательными условиями. В тесте, которое я сделал: с неотрицательными условиями запрос занимает менее секунды. Сгенерированный запрос занимает более 3 секунд. – avesse

ответ

0
var query = 
    from r in db.Requests.Where(r => r.Completed == someBooleanVal && r.Cancelled == someOtherBool) 
    select r; 

    return query.ToList(); 

Надеюсь, это поможет вам и у вас будет хороший день.