Entity Framework Core SQL Server中的空间类型

8

我需要处理地理距离。

我得到了

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

这些诊所存储在SQL Server数据库中。我需要按照距离某个点的远近对它们进行排序。 根据我的了解,Entity Framework Core不支持DbGeography或类似于表示SQL Server类型的功能:

geography

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

UPDATE Clinics SET Geo = geography::Point(Clinics.Latitude, Clinics.Longitud,4326)

好的,现在我需要将它们排序并返回。SQL支持通过查询来实现这一点。

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

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

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

事实上,正如FromSql的文档所述,如果返回的数据与模型不完全匹配,则会导致崩溃。

因为在C#中我无法拥有代表地理信息的DbGeography,所以我无法弄清楚如何解决这个问题。

编辑 1:

通过以下方式部分解决了该问题:

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

现在我已经获得了所有诊所的属性,它可以工作!问题是,诊所有一个相关的类别Amenities。

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

因此,当我运行一个查询时,我需要通过linq包括设施。

query = query.Include(c => c.ClinicAmenities).ThenInclude(ca => ca.Amenity);

我认为这是因为原始SQL中的Orderby出现在Include之前而导致的死机。

你解决了吗?当你“ThenIncluded”设施时,是否收到了错误消息? - influent
1个回答

1

你没有说明你得到了什么错误。

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

你可以执行两个查询。

类似这样的操作

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接