LINQ查询生成超时

问题描述 投票:0回答:1

我有一个查询,看起来像这样:

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.

这有什么错我的代码和我需要什么改变来解决这个问题?

c# linq linq-to-sql
1个回答
6
投票

作为@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]

这是快速,高效。

© www.soinside.com 2019 - 2024. All rights reserved.