我希望使用asp .net core v2 web api服务进行一些空间计算。但由于.Net标准2.0缺乏对dbgeography空间类型的支持,我认为这是不可能的。目前是否有任何解决方法,直到dbgeography或其等效项得到支持?
我希望使用asp .net core v2 web api服务进行一些空间计算。但由于.Net标准2.0缺乏对dbgeography空间类型的支持,我认为这是不可能的。目前是否有任何解决方法,直到dbgeography或其等效项得到支持?
在尝试了不同的库之后,我最终自己制作了一个类。为了优化它,我想与大家分享。
- 场景:需要获取用户和商店之间的距离
- 商店类:
public class Store
{
public int Id { get; set; }
public string Description { get; set; }
public string Name { get; set; }
public Location Location { get; set; }
}
public class Location
{
public DataContext _dbContext { get; set; }
public Location()
{
}
public Location(DataContext dbContext)
{
_dbContext = dbContext;
}
public double Longitude { get; set; }
public double Latitude { get; set; }
public double Distance(Location destination, int srid=4326)
{
var source = this;
var Distance = string.Empty;
var query = @"DECLARE @target geography = geography::Point(" + destination.Latitude + @"," + destination.Longitude + @"," +srid+@")
DECLARE @orig geography = geography::Point(" + source.Latitude + @"," + source.Longitude + @"," + srid + @")
SELECT @orig.STDistance(@target) as Distance";
try
{
var dbConn = _dbContext.Database.GetDbConnection();
dbConn.Open();
var command = dbConn.CreateCommand();
command.CommandType = System.Data.CommandType.Text;
command.CommandText = query;
return Convert.ToDouble(command.ExecuteScalar().ToString());
}
catch (Exception ex)
{
Error.LogError(ex);
throw ex;
}
}
}
modelBuilder.Entity<Store>().OwnsOne(c => c.Location);
并像这样使用它:
Location loc = new Location(_dbContext); var store = _dbContext.Store.FirstOrDefault(); loc.Longitude = 55.22; loc.Latitude = 33.55; var distance = store.Location.Distance(loc);
如果需要帮助,请随时与我联系。我想发表评论,但目前还不能。试着查看这篇文章,它展示了使用空间操作的一个解决方案:System.Data.Entity.Spatial replacement in ASP.NET Core