C# MySql Dapper MySql 几何

C# MySql Dapper MySqlGeometry

我正在尝试使用 Dapper 将多边形作为 MySql几何体。
但是 MySql 连接器仅将 MySqlGeometry 理解为 Point。
我还需要其他类型,比如多边形。
这是我从其他论坛得到的:

// 1. Add Dapper custom Type handler.
Dapper.SqlMapper.AddTypeHandler(new MySqlGeometryTypeHandler());    

// 2. Implement that custome handler.
public class MySqlGeometryTypeHandler : SqlMapper.TypeHandler<MySqlGeometry>
{
    public override MySqlGeometry Parse(object value) { return new MySqlGeometry(MySqlDbType.Geometry, (byte[])value); }
    public override void SetValue(System.Data.IDbDataParameter parameter, MySqlGeometry value) { parameter.Value = value; }
}

// 3. Here is the Data class
public class Geo
{ 
    public int Id { get; set; } 
    public MySqlGeometry G { get; set; }
}

// 4. Here is the Dapper query
List<Geo> datas = Dapper.SqlMapper.Query<Geo>(cnn, "select * from geo;").ToList();

如何获取 'geo' table 中的多边形行?

事实证明 - MySqlGeometry 不支持(希望如此)除 Point 之外的其他类型。
所以我得到的解决方案是:

  1. 在模型中使用 Microsoft 的 System.Data.Spatial.DbGeography 而不是 MySqlGeometry。
    public class Geo
    {
        public int Id { get; set; }
        public DbGeography G { get; set; }
    }
  1. 相应地更改自定义类型处理程序和注册:
    public class DbGeographyTypeHandler : SqlMapper.TypeHandler<DbGeography>
    {
        public override DbGeography Parse(object value) { return DbGeography.FromBinary((byte[])value); }
        public override void SetValue(IDbDataParameter parameter, DbGeography value) { parameter.Value = value.AsBinary(); }
    }

Dapper.SqlMapper.AddTypeHandler<DbGeography>(new DbGeographyTypeHandler());

  1. 并将 sql 更改为 return 作为标准 WKB 的值,Microsoft 的 DbGeography 可以理解。您也可以使用 st_asbinary 而不是 st_aswkb - 两者都对我有用。
List<Geo> datas = Dapper.SqlMapper.Query<Geo>(conn, "select id, st_aswkb(g) g from geo;").ToList();
  1. 请注意:
  • MySql是8,Dapper是2.0.78。
  • 我使用了 DbGeography - 因为我需要地球地理位置,而不是 DbGeometry。
  • 我将 MySql 列数据类型用作几何,因为我需要对其进行空间索引 更快的数据检索。
  • 如果您需要空间索引,请确保将您的几何列设置为非空,并使用 srid(例如 4326),因为默认 srid 0 将导致您的查询忽略空间索引。