空间类型实体框架核心SQL Server

时间:2017-05-19 13:30:27

标签: c# sql-server entity-framework entity-framework-core

我需要处理地理距离。

我得到了

model

此诊所位于SQL Server数据库上。我需要将它们按距离排列到某一点。 对于我所读到的,Entity Framework Core不支持DbGeography或类似的东西来表示SQL Server类型:

public class Clinic
{
    ...
    public double Latitude
    public double Longitud
    ...
}

我在数据库中添加了一个列,其中包含每个诊所的计算地理点

geography

好的,知道我需要退回订购。 SQL通过查询

来支持这一点
UPDATE Clinics SET Geo = geography::Point(Clinics.Latitude, Clinics.Longitud,4326)

和Entity Framework Core支持使用原始SQL进行查询。

DECLARE @p geography;
SET @p = geography::Point(41,2,4326);
SELECT * FROM Clinics c ORDER BY @p.STDistance(c.Geo);

正如FromSql的文档所说,如果您要返回的数据与模型完全匹配,那么它就会崩溃。 和C#一样,我不能使用代表Geo的DbGeography,我无法弄清楚如何解决这个问题。

编辑1:

部分使用以下内容:

context.Clinics.FromSql("..query..")

所以现在我获得了诊所的所有属性,它的确有效!事实是,诊所有相关的课程设施

string rawSQL = @"
        DECLARE @p geography;
        SET @p = geography::Point(41,2,4326);
        SELECT c.Id, c.Name, c.Price, c.Quote, c.QuoteAuthor, c.QuoteSource, c.Description, c.Image, c.Latitude, c.Longitude, c.Category, c.CenterDistance, c.NumReviews, c.Stars
        FROM Clinics c
        ORDER BY @p.STDistance(c.Geo); ";
query = query.FromSql(rawSQL);

因此,当我运行查询时,我需要包含linq的设施

public class Clinic
{
    ...
    public double Latitude
    public double Longitud
    public Amenity amenity
    ...
}

Dies因为来自原始sql的Orderby出现在我相信的包含之前

1 个答案:

答案 0 :(得分:0)

你没有指明你得到的错误。

在我看来,你得到错误"调用存储过程时不支持Include操作。"

你可以做的是执行两个查询。

像这样的东西

dbContext.Amenities.Load();

string rawSQL = @"
          DECLARE @p geography;
          SET @p = geography::Point(41,2,4326);
          SELECT c.Id, c.Name, c.Price, c.Quote, c.QuoteAuthor
          FROM Clinics c
          ORDER BY @p.STDistance(c.Geo)";

// EF will automatically wire up the references between entities 
// that have been queried for
var clinicsWithAmenities = dbContext.Clinics.FromSql(rawSQL).ToList();