2010-09-08 65 views
1

我正在使用LINQ to SQL來檢索數據,使用布爾條件(SQL中的BIT列)。我的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相比如何執行? – 2010-09-08 06:59:53

+0

位域可能爲空嗎? – leppie 2010-09-08 06:59:53

+0

我已經嘗試過與非負面條件。在我做的一個測試中:在非負面條件下,查詢不到一秒鐘。使用生成的查詢,它需要超過3秒鐘。 – avesse 2010-09-13 12:24:50

回答

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

    return query.ToList(); 

希望它能幫助你,祝你有美好的一天。