2016-04-11 94 views
0

我有一个查询,看起来像这样:Linq查询生成超时

var TheDataToDelete = (from x in MyDC.SomeTable 
         where x..... 
         select x).ToList(); 

if (TheDataToDelete.Count > 0) 
{ 
    MyDC.SomeTable.DeleteAllOnSubmit(TheDataToDelete); 
    MyDC.SubmitChanges(); 
} 

大约有10K行删除,并在我的错误日志我有时(每周一次)看到此错误:

Inner Exception Type: System.ComponentModel.Win32Exception 
Inner Exception: The wait operation timed out 
Inner Source: 
Exception Type: System.Data.SqlClient.SqlException 
Exception: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 

我的代码出了什么问题,需要更改哪些内容才能解决问题?

感谢。

+1

用'TheDataToDelete.Any()'替换'TheDataToDelete.Count> 0'。所有你需要知道的是是否至少有一个项目。你真的不需要计算10K项目。 – Shyju

回答

5

正如@Shyju建议,使用Any()。但也删除ToList(),因为它已经执行查询。不添加它会使查询执行延迟。而因为那时只做Any()查询会更有效率。

var TheDataToDelete = (from x in MyDC.SomeTable 
         where x..... 
         select x); 

if (TheDataToDelete.AnY()) 
{ 
    MyDC.SomeTable.DeleteAllOnSubmit(TheDataToDelete); 
    MyDC.SubmitChanges(); 
} 

哪个会产生SQL查询;

SELECT 
    (CASE 
     WHEN EXISTS(
      SELECT x 
      FROM MyDC.SomeTable 
      WHERE x 
      ) THEN 1 
     ELSE 0 
    END) AS [value] 

这是快速和高效的。