我有一个大约有380,000行的SQL表。
在SQL SMSS中,我执行此查询:
SELECT Longitude, Latitude, street FROM [Stops].[dbo].[Members]
WHERE ABS(Latitude - 51.463419) < 0.005 AND ABS(Longitude - 0.099) < 0.005
它几乎立即返回大约20个结果。
我有一个WCF webserice将我的数据暴露给我的Windows手机应用程序:
public class Service1 : IService1
{
double curLatitude = 51.463;
double curLongitude = 0.099;
public List<Member> GetMembers()
{
DataClassesDataContext db = new DataClassesDataContext();
var members = from member in db.Members
where (Convert.ToDouble(member.Latitude) - curLatitude) < 0.005 && (Convert.ToDouble(member.Longitude) - curLongitude) < 0.005
select member;
return members.ToList();
}
}
我相信它正在执行相同的查询,但也将项目添加到List。
问题是,需要7分钟以上才能得到一些奇怪的异常,所以永远不会完成。 VS2010中的WCF服务测试程序只是填充内存并在执行此操作时使用大量CPU。 我的感觉是ToList做了一些奇怪的事情?
答案 0 :(得分:3)
您缺少LINQ版本中的abs部分。
一些旁注。
您可以至少以两种可能的方式跟踪SQL查询。
db.Log = Console.Out;
(或其他TextWriter
)并检查Visual Studio中的输出窗口。你应该处理你的DataClassesDataContext,最好的方法是将它放在一个使用块中:
public List<Member> GetMembers()
{
using(DataClassesDataContext db = new DataClassesDataContext())
{
var members = from member in db.Members
where (Convert.ToDouble(member.Latitude) - curLatitude) < 0.005
&& (Convert.ToDouble(member.Longitude) - curLongitude) < 0.005
select member;
return members.ToList();
}
}
答案 1 :(得分:2)
这里有很多问题:
因此;首先要做的是确定时间的去向。
任何或所有这些都可能需要在此进行优化。