2010-09-08 76 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(); 

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