깔끔하게 공간 데이터 쿼리

c# dapper micro-orm spatial sql-server

문제

관련 질문 몇 가지를 찾았지만 작성자는 포기 프로 시저를 사용하여 '매핑'을 수행했습니다.

이것은 실제로 여기 에서 연속 질문입니다 .

모델

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는 공간 데이터를 이해하지 못하고 많은 사람들이 말했듯이 벤더 특정 구현을 지원하는 것은 원래의 의도가 아닙니다. 그러나 Query<T> 지원을 확장하는 문서는 찾기가 어렵습니다.

수락 된 답변

나는 여기 에 다음 탐구가 통과하는 탐험이 있다 :

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());
    }
}

그것은 생존할만한 것처럼 보이지만 , 나는 모든 것을 점 치지 않고 매 순간마다 엇갈 렸습니다. 그 커밋을 로컬에서 실험 해 볼 수 있습니다. 피드백을 환영합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.