實體框架核心數量沒有最佳性能

c# entity-framework-core linq sql-server

我需要通過某個過濾器獲取記錄數量。

從理論上講這條指令:

_dbContext.People.Count (w => w.Type == 1);

它應該生成SQL,如:

Select count (*)
from People
Where Type = 1

但是,生成的SQL是:

Select Id, Name, Type, DateCreated, DateLastUpdate, Address
from People
Where Type = 1

生成的查詢在具有許多記錄的數據庫中運行需要更長的時間。

我需要生成第一個查詢。

如果我這樣做:

_dbContext.People.Count ();

實體框架生成以下查詢:

Select count (*)
from People

..運行得非常快。

如何生成第二個查詢將搜索條件傳遞給計數?

熱門答案

這裡沒什麼可回答的。如果您的ORM工具沒有從簡單的LINQ查詢生成預期的SQL查詢,那麼您無法通過重寫查詢來讓它執行此操作(並且您不應該首先執行此操作)。

EF Core 在LINQ查詢中具有混合客戶端/數據庫評估的概念,允許他們發布具有不完整/非常低效的查詢處理的EF Core版本,就像您的情況一樣。

不包含在EF Core中的功能摘錄(注意單詞not )和路線圖

改進了轉換以使更多查詢成功執行,在數據庫(而不是內存)中評估更多邏輯。

不久,他們正在計劃改進查詢處理,但我們不知道何時會發生這種程度和程度(記住混合模式允許他們考慮查詢“工作”)。

那有什麼選擇呢?

  • 首先,遠離EF Core,直到它變得非常有用。回到EF6,沒有這樣的問題。
  • 如果您無法使用EF6,請使用最新的EF Core版本保持更新。

例如,在v1.0.1和v1.1.0中,您查詢生成了預期的SQL(已測試),因此您可以簡單地升級並且具體問題將消失。

但請注意,隨著改進,新版本會引入錯誤/回歸(正如您在此處看到的, EFCore為簡單的LEFT OUTER連接返回了太多列 ),因此請自行承擔風險(並再次考慮第一個選項,即哪一個適合你 :)



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因