无法翻译 IsWithinDistance
IsWithinDistance could not be translated
我正在尝试 return 给定位置 50 英里以内的项目列表。
我的table(简体)如下:
- 编号
- 经度
- 纬度
- 状态
- 活跃
我有一个初始查询:
var query = db.MyTable.Where(o=> o.Status == "New" && o.Active == true);
query = query.Where(o => new Point(o.Longitude, o.Latitude)
.IsWithinDistance(new Point(_currentLongitude, _currentLatitude), 50));
var result = query.ToList()
但是 - 它似乎不起作用并且出现如下错误 - 有什么解决办法吗?或者是否有更好的方法获取最近的物品?
.Where(p => new Point(p.Longitude, p.Latitude)
.IsWithinDistance(geom: __p_3,
distance: ___maxDistance_4))' could not be translated.
Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
Startup.cs:
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
x => x.UseNetTopologySuite());
});
要使用此功能,您需要将这些坐标作为 Point
存储在 SQL geography
字段中。您可以轻松地将其作为新 属性.
上的计算列添加到现有模型中
// on your entity
public Point Coordinates { get; }
// in your db context's OnModelCreating
modelBuilder.Entity<YourEntity>()
.Property(x => x.Coordinates)
.IsRequired()
.HasComputedColumnSql("geography::Point(Latitude, Longitude, 4326)");
注意,SRID 4326 是 SQL 服务器支持的常用 lat/lon 坐标系。 More on that here.
构建您的模型并部署到您的数据库。
现在你有了一个空间字段和属性,你可以这样查询:
var point = new Point(_currentLongitude, _currentLatitude) { SRID = 4326 };
var distanceInMeters = 50 * 1609.344; // 50 miles to meters conversion
var results = db.YourEntity
.Where(x => x.Coordinates.IsWithinDistance(point, distanceInMeters))
.ToList();
SRID 4326 使用 米 表示距离,因此如果您使用英里,请务必按上面所示进行转换。
此外,如果您有大量数据,您还需要在该列上添加空间索引,但是 EF Core doesn't support that directly yet 因此您必须直接在 SQL 中执行此操作。
我正在尝试 return 给定位置 50 英里以内的项目列表。
我的table(简体)如下:
- 编号
- 经度
- 纬度
- 状态
- 活跃
我有一个初始查询:
var query = db.MyTable.Where(o=> o.Status == "New" && o.Active == true);
query = query.Where(o => new Point(o.Longitude, o.Latitude)
.IsWithinDistance(new Point(_currentLongitude, _currentLatitude), 50));
var result = query.ToList()
但是 - 它似乎不起作用并且出现如下错误 - 有什么解决办法吗?或者是否有更好的方法获取最近的物品?
.Where(p => new Point(p.Longitude, p.Latitude) .IsWithinDistance(geom: __p_3,
distance: ___maxDistance_4))' could not be translated.Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
Startup.cs:
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
x => x.UseNetTopologySuite());
});
要使用此功能,您需要将这些坐标作为 Point
存储在 SQL geography
字段中。您可以轻松地将其作为新 属性.
// on your entity
public Point Coordinates { get; }
// in your db context's OnModelCreating
modelBuilder.Entity<YourEntity>()
.Property(x => x.Coordinates)
.IsRequired()
.HasComputedColumnSql("geography::Point(Latitude, Longitude, 4326)");
注意,SRID 4326 是 SQL 服务器支持的常用 lat/lon 坐标系。 More on that here.
构建您的模型并部署到您的数据库。
现在你有了一个空间字段和属性,你可以这样查询:
var point = new Point(_currentLongitude, _currentLatitude) { SRID = 4326 };
var distanceInMeters = 50 * 1609.344; // 50 miles to meters conversion
var results = db.YourEntity
.Where(x => x.Coordinates.IsWithinDistance(point, distanceInMeters))
.ToList();
SRID 4326 使用 米 表示距离,因此如果您使用英里,请务必按上面所示进行转换。
此外,如果您有大量数据,您还需要在该列上添加空间索引,但是 EF Core doesn't support that directly yet 因此您必须直接在 SQL 中执行此操作。