簡體   English   中英

Entity Framework 是在數據庫中還是在本地執行 C# 函數?

[英]Does Entity Framework execute C# functions in database or locally?

我有以下 EF6 linq 查詢:

List<Segments> CloseSel = _context?.Segments
   .Where(sv => listGeos.Any(geo => sv.Geometry_Data.Distance(geo) <= radius))
   .ToList();

基本上得到接近幾何點的幾何形狀(類似於 osm),它在本地數據庫中運行良好且非常快(不到 2 秒),但是當我推送遠程數據庫時,查詢需要很長時間,它會引發超時異常(它適用於僅通過 id 獲取對象的其他查詢,所以我知道它不是連接問題)。

它是否有可能在每次嘗試確定行是否接近點時在本地執行Distance() function 並返回 C# 端?

如果是這樣,是否可以通過存儲過程或 SQL 端的 function 來解決?

編輯:這里有更多細節,本地數據庫是一個 mdf 文件,而“遠程”文件是附加到 sql 服務器實例的同一個 mdf 文件,這是我正在使用的連接字符串。 該表的條目少於 100 萬個。 距離 function 實際上來自 class System.Data.Entity.Spatial,它在 sql 中被轉換為 STDistance,所以它不應該是它拉整個表的原因。 這是翻譯后的查詢:

SELECT 
[Extent1].[Id_Segment] AS [Id_Segment], 
...
[Extent1].[Geometry_Data] AS [Geometry_Data]
FROM [dbo].[Segments] AS [Extent1]
WHERE  EXISTS (SELECT 
    1 AS [C1]
    FROM  (SELECT 
        geometry::STGeomFromText(N'POINT (35 30)', 0) AS [C1]
        FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]
    UNION ALL
        SELECT 
        geometry::STGeomFromText(N'POINT (45 20)', 0) AS [C1]
        FROM  ( SELECT 1 AS X ) AS [SingleRowTable2]
    ...
    UNION ALL
        SELECT 
        geometry::STGeomFromText(N'POINT (25 10)', 0) AS [C1]
        FROM  ( SELECT 1 AS X ) AS [SingleRowTable13]) AS [UnionAll12]
    WHERE ([Extent1].[Geometry_Data].STDistance([UnionAll12].[C1])) <= 5
)

現在真正好奇的是,在本地查詢可能需要 5 秒,但如果我嘗試直接在遠程 sql 服務器上執行它,則需要十多分鍾(我不得不在結束前停止)

編輯2:

好吧,事實證明,遠程數據庫使用的是 2012 sqlserver,當時它實際上並沒有針對空間數據進行優化,因為空間數據的廣泛傳播來得稍晚一點,當我在 2019 sqlserver 上嘗試它時,它也一樣性能作為 mdf 文件,因為 EF6 隱含地將文件作為更新版本的 sqlserver 處理。 如果無法升級,這是嘗試解決舊 sqlserver 版本問題的鏈接

一旦您使用本地 function 來評估條件,就必須首先從數據庫中檢索整個數據集。

為了克服這個問題,創建一個 UDF 並將其結果用於計算列或map以便它可以在 LINQ 查詢中使用。 這樣,在服務器上評估條件,並且僅將適當的數據傳輸到客戶端。

暫無
暫無

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

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