Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DbContext仅在远程服务器上超时_C#_Asp.net_Asp.net Mvc 3_Linq - Fatal编程技术网

C# DbContext仅在远程服务器上超时

C# DbContext仅在远程服务器上超时,c#,asp.net,asp.net-mvc-3,linq,C#,Asp.net,Asp.net Mvc 3,Linq,我这里有一个()在本地SQL2008上工作,大约在00:00:00s-00:00:01s,但是在远程服务器上,大约需要00:02:10s。dbo.Movies、dbo.Boxarts和dbo.OmdbEntries中分别有大约56k项和300k项 {SELECT //pull distinct t_meter out of the created object Distinct2.t_Meter AS t_Meter //match all movie data on the same movi

我这里有一个()在本地SQL2008上工作,大约在00:00:00s-00:00:01s,但是在远程服务器上,大约需要00:02:10s。dbo.Movies、dbo.Boxarts和dbo.OmdbEntries中分别有大约56k项和300k项

{SELECT
//pull distinct t_meter out of the created object
Distinct2.t_Meter AS t_Meter
//match all movie data on the same movie_id
FROM ( SELECT DISTINCT
        Extent2.t_Meter AS t_Meter
        FROM    dbo.Movies AS Extent1
        INNER JOIN dbo.OmdbEntries AS Extent2 ON Extent1.movie_ID = Extent2.movie_ID
        INNER JOIN dbo.BoxArts AS Extent3 ON Extent1.movie_ID = Extent3.movie_ID
        //pull the genres matched on movie_ids
        INNER JOIN  (SELECT DISTINCT
                Extent4.movie_ID AS movie_ID
                FROM  dbo.MovieToGenres AS Extent4
                //all genres matched on movie ids
                INNER JOIN dbo.Genres AS Extent5 ON Extent4.genre_ID = Extent5.genre_ID ) AS Distinct1 ON Distinct1.movie_ID = Extent1.movie_ID
        WHERE 1 = 1
//sort the t_meters by ascending
)  AS Distinct2
ORDER BY Distinct2.t_Meter ASC}
内部查询首先获取表中的所有相关项,然后创建一个新对象,然后从该对象中,仅查找不为null的
t\u Meter
s。然后从这些
t\u表
s中,仅选择不同的项目,然后对它们进行排序,以返回大约98个
int的列表

我对SQL数据库的了解还不够,无法直观地知道这是否是一组用于单个查询的极端db调用,但由于在本地服务器上只需一秒钟或更短的时间,我认为这是可以的


编辑:这是我还没有真正清理的LINQ代码:它很凌乱,但它完成了任务。。。我找到的修复方法是在
OrderBy
之后调用
ToArray
,但在
之前,Distinct
起了很大的作用。所以不是

 var results = IQueryableWithDBDatasTMeter.Distinct().OrderBy().ToArray()
 var results = IQueryableWithDBDatasTMeter.Distinct().OrderBy().ToArray()
是的


我敢肯定,如果我链接了Linq代码(并清理了它),而不是自动生成的SQL查询,您将能够轻松解决此问题,对此我深表歉意。

以下是我尚未真正清理的Linq代码:它很凌乱,但它完成了任务。。。我找到的修复方法是在
OrderBy
之后调用
ToArray
,但在
之前,Distinct
起了很大的作用。所以不是

 var results = IQueryableWithDBDatasTMeter.Distinct().OrderBy().ToArray()
 var results = IQueryableWithDBDatasTMeter.Distinct().OrderBy().ToArray()
是的

我猜它之所以有效是因为它只针对内存中的数组运行
Distinct
,而不是针对整个DB的条目?不过我不太确定,因为旧的LINQ在我的本地服务器上工作得非常完美


我敢肯定,如果我链接了Linq代码(并清理了它),而不是自动生成的SQL查询,您将能够轻松解决此问题,对此表示抱歉。

您可以检查服务器上执行了哪些查询吗?(这是在什么查询中翻译的)@GabrielMonteiroNepomuceno我不太明白,但是如果你是说使用活动监视器,我由于权限原因无法访问它。您的意思是向您显示创建此查询的Linq To SQL吗?如果您使用Visual studio ultimate并打开intelletrace,您将在那里看到针对数据库的所有查询。如果没有VisualStudioUltimate,最简单的方法是使用本地数据库上的配置文件来查看应用程序正在进行的查询。我认为问题在于n+1查询。远程服务器是否具有完全相同的模式,包括索引定义?能否检查本地计算机和远程服务器的执行计划是否相同(在Sql Server Management Studio中)?您还可以尝试将查询拆分为三个单独的查询,看看这是否有帮助(或者至少您知道哪个部分需要这么长的时间)。如果发布Linq查询,可能会有所帮助,否则您应该将其标记为SQL而不是Linq。另外,为什么查询会执行与似乎未使用的BoxArts和流派的连接。这仅仅是为了排除没有相关记录的记录吗?