簡體   English   中英

空間類型實體框架核心SQL Server

[英]Spatial type Entity Framework Core SQL Server

我需要處理短程距離。

我有

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#中一樣,我無法使用表示Geo的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);

因此,現在我掌握了Clinics的所有屬性,並且可以正常工作! 問題是,診所有相關的設施

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操作”。

您可以執行兩個查詢。

像這樣

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM