我找到了一些相关的问题 https://stackoverflow.com/questions/18088169/dapper-spatial-geography-type,但作者放弃了,继续使用存储过程来进行“映射”。
这实际上是一个延续问题here https://stackoverflow.com/questions/24402424/how-to-insert-dbgeography-to-sql-server-using-dapper
Model
public class Store
{
public int Id { get; private set; }
public string Name { get; set; }
public string Address { get; set; }
public DbGeography Location { get; set; }
}
Querying
using (SqlConnection conn = SqlHelper.GetOpenConnection())
{
const string sql = "Select * from Stores";
return conn.Query<Store>(sql, new { Tenant_Id = tenantId });
}
Dapper 不理解空间数据,正如许多人所说,支持供应商特定实现并不是作者的初衷。但扩展的文档Query<T>
很难找到支持
我对此有一个探索here https://github.com/StackExchange/dapper-dot-net/commit/e26ee0abe5bdff561ff59fded87cabb9f5d983a1,以下测试通过:
class HazGeo
{
public int Id { get;set; }
public DbGeography Geo { get; set; }
}
public void DBGeography_SO24405645_SO24402424()
{
global::Dapper.SqlMapper.AddTypeHandler(typeof(DbGeography), new GeographyMapper());
connection.Execute("create table #Geo (id int, geo geography)");
var obj = new HazGeo
{
Id = 1,
Geo = DbGeography.LineFromText("LINESTRING(-122.360 47.656, -122.343 47.656 )", 4326)
};
connection.Execute("insert #Geo(id, geo) values (@Id, @Geo)", obj);
var row = connection.Query<HazGeo>("select * from #Geo where id=1").SingleOrDefault();
row.IsNotNull();
row.Id.IsEqualTo(1);
row.Geo.IsNotNull();
}
class GeographyMapper : Dapper.SqlMapper.TypeHandler<DbGeography>
{
public override void SetValue(IDbDataParameter parameter, DbGeography value)
{
parameter.Value = value == null ? (object)DBNull.Value : (object)SqlGeography.Parse(value.AsText());
((SqlParameter)parameter).UdtTypeName = "GEOGRAPHY";
}
public override DbGeography Parse(object value)
{
return (value == null || value is DBNull) ? null : DbGeography.FromText(value.ToString());
}
}
It looks可行,但我还没有在每个 i 上加点并在每个 t 上划线。欢迎您在本地尝试该提交 - 我希望得到反馈。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)