【发布时间】:2019-03-06 17:10:08
【问题描述】:
我们有一个以经纬度为列的邮政编码表,由于生产需要,无法更改为空间数据类型。
正在使用STDistance(),但出现错误:
LINQ to Entities 无法识别该方法
因此我必须调用toList 然后只使用STDistance(),这会将每个邮政编码都拉入系统并导致性能下降。
private static List<string> GetPostalCodesWithinRange( DbContext db, double latitude, double longitude)
{
var yourLocation = SqlGeography.Point(latitude, longitude, 4326);
var query = from postal in db.POSTALS
.Where(x => x.LATITUDE != null ||
x.LONGITUDE != null)
.ToList()
let distance = SqlGeography.Point((double)postal.LATITUDE.Value, (double)postal.LONGITUDE.Value, 4326).STDistance(yourLocation)
.Value
where postal.LATITUDE != null && postal.LONGITUDE != null && distance < 3000
orderby distance
select postal.POSTAL_CODE;
return query.Distinct().ToList();
}
目前PostalstoList()方法只过滤掉空的纬度和经度
db.POSTALS.Where(x => x.LATITUDE != null || x.LONGITUDE != null).ToList()
由于我们只检查 3km 以内的经纬度,现在我们想优化查询,只拉取位于 3km 正方形边界内的经度和纬度,然后使用上述方法仅按半径过滤。
请问有什么方法可以得到距离中心1.5公里的角落longlat点?
【问题讨论】:
-
出于好奇,您是否有兴趣添加一个计算列,该列是基于现有 lat 和 long 列的空间点?
-
@BenThul 这可能是一个很好的解决方案,但就目前而言,我打算在不更改生产数据库的情况下这样做。
-
您可以创建一个使用 STDistance 函数的 T-SQL 存储过程,并使用 LINQ to Entities 调用该存储过程。如果您的生产系统不允许您创建存储过程,或者您可以使用 STDistance 函数编写 SQL 查询并使用 SQLQuery() 直接从 LINQ 执行 SQL 到实体。这些中的任何一个都可以消除计算角点的需要!
标签: sql-server entity-framework sqlgeography