我在这里有一个Linq To Sql 查询(或带括号),它在我的本地 SQL2008 上工作,大约在 00:00:00s - 00:00:01s,但在远程服务器上,它需要大约 00:02:10s . dbo.Movies、dbo.Boxarts 中有大约 56k 项,dbo.OmdbEntries 中有 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}
内部查询首先获取表中的所有相关项,然后创建一个新对象,然后从该对象中仅查找t_Meter
不为空的 s。然后从这些t_Meter
s 中,仅选择不同的项目,然后对它们进行排序,以返回 98 左右的列表ints
。
我对 SQL 数据库的了解还不够,无法直观地知道这是否是一组极端的 db 调用以放入单个查询中,但是由于在我的本地服务器上只需要一秒钟或更短的时间,我认为它没关系。
编辑:这是我根本没有真正清理的 LINQ 代码:http: //pastebin.com/JUkdjHDJ它很乱,但它完成了工作......我发现的修复是在调用ToArray
之后OrderBy
,但在Distinct
帮助之前非常。所以而不是
var results = IQueryableWithDBDatasTMeter.Distinct().OrderBy().ToArray()
我做了
var orderedResults = IQueryableWithDBDatasTMeter.OrderBy().ToArray()
var distinctOrderedResults = orderedResults.Distinct().ToArray()
我确定如果我链接了 Linq 代码(并清理了它)而不是自动生成的 SQL 查询,那么您将能够轻松解决这个问题,对此感到抱歉。