【问题标题】:C# MySql Dapper MySqlGeometryC# MySql Dapper MySqlGeometry
【发布时间】:2021-07-10 02:16:49
【问题描述】:

我正在尝试使用 Dapper 将多边形作为 MySqlGeometry。
但是 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();

如何获取“地理”表中的多边形行?

【问题讨论】:

    标签: c# mysql spatial dapper


    【解决方案1】:

    它出来了 - 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 以将值作为标准 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 列数据类型作为 Geometry,因为我需要空间索引 更快的数据检索。
    • 如果您需要空间索引,请确保将 Geometry 列设置为非 null,并使用 srid(例如 4326),因为默认 srid 0 会导致您的查询忽略空间索引。

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      相关资源
      最近更新 更多