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 之外的其他类型。
所以我得到的解决方案是:
- 在模型中使用 Microsoft 的 System.Data.Spatial.DbGeography 而不是 MySqlGeometry。
public class Geo
{
public int Id { get; set; }
public DbGeography G { get; set; }
}
- 相应地更改自定义类型处理程序和注册:
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());
- 并将 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();
- 请注意:
- MySql是8,Dapper是2.0.78。
- 我使用了 DbGeography - 因为我需要地球地理位置,而不是 DbGeometry。
- 我将 MySql 列数据类型用作几何,因为我需要对其进行空间索引
更快的数据检索。
- 如果您需要空间索引,请确保将您的几何列设置为非空,并使用 srid(例如 4326),因为默认 srid 0 将导致您的查询忽略空间索引。
我正在尝试使用 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 之外的其他类型。
所以我得到的解决方案是:
- 在模型中使用 Microsoft 的 System.Data.Spatial.DbGeography 而不是 MySqlGeometry。
public class Geo
{
public int Id { get; set; }
public DbGeography G { get; set; }
}
- 相应地更改自定义类型处理程序和注册:
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());
- 并将 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();
- 请注意:
- MySql是8,Dapper是2.0.78。
- 我使用了 DbGeography - 因为我需要地球地理位置,而不是 DbGeometry。
- 我将 MySql 列数据类型用作几何,因为我需要对其进行空间索引 更快的数据检索。
- 如果您需要空间索引,请确保将您的几何列设置为非空,并使用 srid(例如 4326),因为默认 srid 0 将导致您的查询忽略空间索引。