我遇到了一种情况,在这种情况下,我需要找到最接近DbGeography点的道路。
在某些情况下,这需要5-8秒的时间。
我在专栏上有一个Spatial_Index,我重新组织了它,所以它不是支离破碎的。
此查询相当重,有时CPU使用率因此而提高到100%。
这张表是这样的:

以下是空间结果(万一有帮助):

public string GetRoad(DbGeography point)
{
var name = "";
try
{
using (var gisEntities = new GISSpatialEntities())
{
var query = String.Format(@"
DECLARE @point geography;
SET @point = geography::STPointFromText('POINT({0} {1})', 4326);
SELECT TOP 10 * FROM GeographyLine
WHERE GeoLine.STIsValid() =1 AND @point.STBuffer(200).STIntersects(GeoLine) = 1
ORDER BY GeoLine.STDistance(@point)", point.Longitude, point.Latitude);
var firstOrDefault = gisEntities.GeographyLines.SqlQuery(query).FirstOrDefault();
if (firstOrDefault != null)
{
name = firstOrDefault.LineName;
}
}
}
catch (Exception ex)
{
var msg = string.Format("Exception in GetRoad() - {0} - Inner [{1}] \r\n", ex.Message, ex.InnerException);
_logger.LogMessage(MessageType.Error, msg);
}
return name;
}发布于 2015-11-20 06:47:01
SELECT TOP 10 * FROM ...,而应该只检索所需的列,在您的示例中,该列是LineName。var name = ""不需要出现在那里,如果您只是return firstOrDefault.LineName,并且没有结果/异常返回string.Empty。var firstOrDefault工作时,我想说,在这里使用var是错误的,因为从作业的正确方面看,不清楚类型是什么。变量名firstOrDefault没有足够的描述性,因此您应该考虑使用geographyLine或foundGeographyLine。TOP 10,但使用的是FirstOrDefault。这看起来不太对。使用SELECT TOP 1会更好、更快。https://codereview.stackexchange.com/questions/111282
复制相似问题