J'ai trouvé des questions connexes, mais l'auteur a abandonné et a continué à utiliser les procédures stockées pour effectuer le «mapping».
Ceci est en fait une question de continuation d' ici
public class Store
{
public int Id { get; private set; }
public string Name { get; set; }
public string Address { get; set; }
public DbGeography Location { get; set; }
}
using (SqlConnection conn = SqlHelper.GetOpenConnection())
{
const string sql = "Select * from Stores";
return conn.Query<Store>(sql, new { Tenant_Id = tenantId });
}
Dapper ne comprend pas les données spatiales et, comme beaucoup l’ont dit, les auteurs n’avaient pas l’intention initiale de prendre en charge les implémentations spécifiques aux fournisseurs. Mais la documentation pour étendre le support de Query<T>
est difficile à trouver
J'ai une exploration à ce sujet ici , pour laquelle les tests suivants réussissent:
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());
}
}
Cela semble viable, mais je n'ai pas encore jeté tous les points et je les ai tous franchis. Nous vous invitons à expérimenter avec cet engagement local - j'adorerais vos commentaires.