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

c# entity-framework entity-framework-core sql-server

我需要處理地理距離。

我有

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

該診所位於SQL Server DB上。我需要按距離將它們返回到某一點。對於我讀到的內容,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);

所以現在我得到了診所的所有屬性,它的確有效!事實是,診所有相關的課程設施

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在我相信包含之前

熱門答案

您沒有指定您獲得的錯誤。

在我看來,你得到錯誤“調用存儲過程時不支持包含操作。”

你可以做的是執行兩個查詢。

像這樣的東西

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow